如何构造一个包含多种数据类型值的字节数组?
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,它将由datacenter
、client_id
、data_id
、data_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();
将每个部分转换为字节,然后将它们连接起来
(而不是<<
-thing)也可以。
【讨论】:
感谢 deviantfan 的建议。在这种情况下,我将如何声明以及 datacenter、client_id、data_id 和 data_counter 的数据类型是什么? 见上面添加的方法。字节,短,整数,长。 现在知道了。谢谢您的帮助。你能解释一下,你为什么为字节缓冲区分配8
?有什么具体原因吗?
因为 long 有 8 个字节,因此字节数组也将有 8 个元素。
我明白了,你的意思是说 8 个元素,1 字节数据中心,2 字节 client_id,1 字节 data_id 和 4 字节 data_counter 对吧?以上是关于如何构造一个包含多种数据类型值的字节数组?的主要内容,如果未能解决你的问题,请参考以下文章