我在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}},datacenter
,client_id
,data_id
它们在Java中也应该与c ++中的数据类型相同。
在Java中,我想创建一个最终字节数组data_counter
,它将是uint64_t,它将由customer_address
,datacenter
,client_id
,{{组成1)在Java中具有相同的数据类型。我该怎么做?
任何简单的例子都会帮助我更好地理解。
更新
我的下方方法看起来是否合适?
data_id
答案 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();
将每个部分转换为字节并在之后连接它们
(而不是<<
- 东西)也会起作用。