我有一个 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),然后它将被制作由 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);
}
最佳答案
首先,您可以将值存储在 Long
中与 C/C++ 中的操作方式类似
但要注意 Java 的符号性; +
可以给出除二进制或 |
之外的其他结果
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();
将每个部分转换为字节,然后将它们连接起来
(而不是 <<
-东西)也可以。
关于java - 如何构造一个包含多种数据类型值的字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436810/