gpt4 book ai didi

java - 将短位转换为 int

转载 作者:行者123 更新时间:2023-12-01 18:47:08 25 4
gpt4 key购买 nike

我有一个 TCP 数据包,它发送一堆无符号变量(它们是无符号的,因为它们节省空间并使用唯一 ID 的限制),我需要将这些无符号短位数据转换为 java 中的整数。

所以我的问题是如何将 byteArray[0 - 15] 转换为 int?

编辑:

这是我更改为的代码:

ByteOrder order = ByteOrder.BIG_ENDIAN;
requestedDateType = new BigInteger(ByteBuffer.allocate(2).put(data, 8, 2).order(order).array()).intValue();

传入的数据缓冲区是:

bit   0    1   2   3   4   5   6   7   8   9

value 40 0 0 0 8 0 0 0 1 0

数据以 Little Endian 形式发送。我认为由于 BigInteger 假定为大,因此我需要转换为该值。然而,无论是大订单还是小订单,都给我相同的返回值(value)。

我期望 requestedDateType 的值得到 1,但是我得到 256。如何填充两个缺失的字节以确保它给我 0000 0000 0000 0001 而不是 0000 0001 0000 0000

编辑2:

没关系。将代码更改为:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(data, 8, 2);
int value = ((int)bb.getShort(0)) & 0xff;

最佳答案

在java.nio包中使用ByteBuffer。

//Convert unsigned short to bytes:
//java has no unsigned short. Char is the equivalent.
char unsignedShort = 100;
//Endianess of bytes. I recommend setting explicitly for clarity
ByteOrder order = ByteOrder.BIG_ENDIAN;
byte[] ary = ByteBuffer.allocate(2).putChar(value).order(order).array();

//get integers from 16 bytes
byte[] bytes = new byte[16];
ByteBuffer buffer= ByteBuffer.wrap(bytes);
for(int i=0;i<4;i++){
int intValue = (int)buffer.getInt();
}

如果您对外部库感兴趣,Guava 还具有用于将原始数据转换为字节的例程: http://code.google.com/p/guava-libraries/

此外,我不知道您的用例,但如果您处于项目的开始阶段,我会使用 Google 的 ProtoBufs 来交换协议(protocol)信息。它缓解了协议(protocol)版本之间转换时的麻烦,生成高度紧凑的二进制输出,并且速度很快。

此外,如果您更改语言,您可以找到该语言的 protobufs 库,而不必重写所有协议(protocol)代码。

http://code.google.com/p/protobuf/

关于java - 将短位转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17284379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com