读c++;java中的字节位字段 我有一些遗留系统,它使用C++中的位字段生成字节[]数组,它将通过网络< /P>发送。 struct date_compressed { unsigned int d:5; //2 bytes unsigned int m:4; //1 bytes unsigned int y; //4 bytes }; This produces a hex string of 9fd3d46fde070000

读c++;java中的字节位字段 我有一些遗留系统,它使用C++中的位字段生成字节[]数组,它将通过网络< /P>发送。 struct date_compressed { unsigned int d:5; //2 bytes unsigned int m:4; //1 bytes unsigned int y; //4 bytes }; This produces a hex string of 9fd3d46fde070000,java,c++,byte,bit-fields,Java,C++,Byte,Bit Fields,我需要能够在Java中读取这些字节并读取正确的值,我该怎么做 我在看一些ByteBuf图书馆,如netty等,但我找不到任何好的例子,我们如何做到这一点 谢谢请使用,并确保正确设置endianness 范例 当然,年份值是签名的,不是未签名的,就像指定的C++代码一样,但是你没有一年的值那么大。< /P>你的十六进制字符串没有意义。它有8个字节长,所以看起来是零填充的,没关系,我们可以忽略十六进制字符串中的最后四个0,但它设置了30位。这是太多了,因为一年的价值不需要超过12位,5 + 4 +

我需要能够在Java中读取这些字节并读取正确的值,我该怎么做

我在看一些ByteBuf图书馆,如netty等,但我找不到任何好的例子,我们如何做到这一点

谢谢

请使用,并确保正确设置endianness

范例


当然,年份值是签名的,不是未签名的,就像指定的C++代码一样,但是你没有一年的值那么大。< /P>你的十六进制字符串没有意义。它有8个字节长,所以看起来是零填充的,没关系,我们可以忽略十六进制字符串中的最后四个0,但它设置了30位。这是太多了,因为一年的价值不需要超过12位,5 + 4 + 12=21位。为了测试目的,我将我的结构改变为“-C++结构体数据压缩”{无符号int d:5;/2字节未签名int m:5;//2字节未签名int y;//4字节};struct date_compressed dt2={23,06,2015};ByteBuffer buf=ByteBuffer.wrap(数据字节).order(ByteOrder.LITTLE_ENDIAN);int d=buf.getShort()&0x1f;//2字节,5位,无符号int m=buf.getShort()&0xf;//2字节,5位,无符号整数y=buf.getInt();//4字节,32位,有符号,但这张打印的是2015年4月23日,你知道吗?thx@willy为了研究正在发生的事情,直接检查原始字节,C++中的<代码>数据压缩> /代码>和爪哇中的<代码>数据库> <代码>。

byte[] data = new byte[7];
// fill data here

ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
int d = buf.getShort() & 0x1f; // 2 bytes, 5 bits, unsigned
int m = buf.get() & 0xf;       // 1 byte, 4 bits, unsigned
int y = buf.getInt();          // 4 bytes, 32 bits, signed