如何构造一个具有多个数据类型值的字节数组?

时间:2014-10-18 06:08:15

标签: java c++ bytearray bytebuffer

我在C ++中有一个头文件client_address.h,其中我有以下声明 -

typedef uint64_t   CustomerAddress;

void client_data(uint8_t datacenter, 
                  uint16_t client_id, 
                  uint8_t data_id, 
                  uint32_t data_counter,
                  CustomerAddress& customer_address);

然后在我的实现文件client_address.cpp中我实现了client_data方法 - 所以它做的是它需要几个变量作为参数然后将一个最终变量customer_address输出它是uint64_t

void client_data(uint8_t datacenter, 
                  uint16_t client_id, 
                  uint8_t data_id, 
                  uint32_t data_counter,
                  CustomerAddress& customer_address)
{
    customer_address = (uint64_t(datacenter) << 56)
                    + (uint64_t(client_id) << 40)
                    + (uint64_t(data_id) << 32)
                    + data_counter;
}

我需要在Java中做同样的事情,我将有一个变量customer_address,它将是Java中的uint64_t(我猜是Ineteger)然后它将由{组成} {1}},datacenterclient_iddata_id它们在Java中也应该与c ++中的数据类型相同。

在Java中,我想创建一个最终字节数组data_counter,它将是uint64_t,它将由customer_addressdatacenterclient_id,{{组成1)在Java中具有相同的数据类型。我该怎么做?

任何简单的例子都会帮助我更好地理解。

更新

我的下方方法看起来是否合适?

data_id

1 个答案:

答案 0 :(得分:2)

首先,您可以将值存储在Long中,与C / C ++中的值相似 但要注意Javas签名; +可以提供除二进制文件或|之外的其他结果 IE浏览器。像Long的那样:

customer_address = (datacenter << 56)
                   | (client_id << 40)
                   | (data_id << 32)
                   | data_counter;

当然,你也可以在这里转换变量,就像在C / C ++中一样 (如果他们不长) 你问题中的函数可能看起来像那样(但是返回值为
而不是引用,因为原始类型的Java很痛苦):

long client_data(byte datacenter, 
    short client_id, 
    byte data_id, 
    int data_counter)
{
    return ((long(datacenter) << 56)
    | (long(client_id) << 40)
    | (long(data_id) << 32)
    | long(data_counter));
}

然后,您可以获得类似的字节数组:

ByteBuffer b = ByteBuffer.allocate(8);
b.order(ByteOrder.BIG_ENDIAN);
b.putLong(blablavariable);
byte[] result = b.array();

将每个部分转换为字节并在之后连接它们 (而不是<< - 东西)也会起作用。