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

标签 java c++ arrays 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),然后它将被制作由 datacenterclient_iddata_iddata_counter 组成,它们在 Java 中也应该具有相同的数据类型,如图所示以上是 C++ 语言。

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

相关文章:

java - 将 JUnit 测试方法放入测试类中是一种不好的做法吗?

c++ - 尝试交换可变参数模板类时如何正确重载 operator=?

c - 通过元素复制分配没有元素的数组?

java - 复制引用数组

java - 找不到 Gradle 命令

java - FileOpenService 抛出 NoClassDefFoundError

java - findViewById(R.id.activity_main) --> 无法解析符号 'activity_main'

c++ - Windows 线程的处理器滴答计数

c++ - 关于在 C++ 中初始化指针

javascript - 反向映射 JSON 数据?