【问题标题】: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++ 程序,这就是原因。

标签: java c++ bytearray bytebuffer


【解决方案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 对吧?
猜你喜欢
  • 2019-01-18
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多