如何构造一个包含多种数据类型值的字节数组?

Posted

技术标签:

【中文标题】如何构造一个包含多种数据类型值的字节数组?【英文标题】:How to construct one Byte Array which will have multiples data types values in it? 【发布时间】:2014-10-18 06:08:14 【问题描述】:

我在 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,即@987654326 @

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),然后它将由 datacenter 组成, client_id, data_id, data_counter 并且它们在 Java 中的数据类型也应该与上面在 c++ 中显示的相同。

在Java中,我想创建一个最终字节数组customer_address,它将是uint64_t,它将由datacenterclient_iddata_iddata_counter组成,在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);

【问题讨论】:

64bit int in java 是Long 你有什么理由不能使用课程吗? @mp_ 实际上,我需要通过网络以网络字节顺序将此字节数组作为 Java 的输入发送到我的 c++ 程序,这就是原因。 【参考方案1】:

首先,您可以将值存储在 Long 中,类似于在 C/C++ 中的操作方式 但要注意 Java 的签名性; + 可能会给出二进制或|以外的其他结果 IE。与Long´s 类似:

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

当然,你也可以在这里转换变量,就像在 C/C++ 中一样 (如果它们还不是 Long)。 像您的问题中这样的函数可能看起来像那样(但返回值 而不是引用,因为这在 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();

将每个部分转换为字节,然后将它们连接起来 (而不是&lt;&lt;-thing)也可以。

【讨论】:

感谢 deviantfan 的建议。在这种情况下,我将如何声明以及 datacenter、client_id、data_id 和 data_counter 的数据类型是什么? 见上面添加的方法。字节,短,整数,长。 现在知道了。谢谢您的帮助。你能解释一下,你为什么为字节缓冲区分配8?有什么具体原因吗? 因为 long 有 8 个字节,因此字节数组也将有 8 个元素。 我明白了,你的意思是说 8 个元素,1 字节数据中心,2 字节 client_id,1 字节 data_id 和 4 字节 data_counter 对吧?

以上是关于如何构造一个包含多种数据类型值的字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组

将包含十六进制值的字节数组转换为十进制值

如何在java中将4字节数组转换为浮点数

如何从字节数组中提取长数据类型?

如何存储多个数据类型的数组

如何显示字节数组十六进制值?