如果你有1,2,4或8个字节,你只需要使用get(),getShort(),getInt()和getLong()。当你有奇数个字节时,如何从ByteBuffer(Little Endian)获得一个long?
有人可以帮帮忙,我应该用它来获得一个长有3,5或7个字节的逻辑是什么?我可能不得不以某种方式用零划一。
如果你有1,2,4或8个字节,你只需要使用get(),getShort(),getInt()和getLong()。当你有奇数个字节时,如何从ByteBuffer(Little Endian)获得一个long?
有人可以帮帮忙,我应该用它来获得一个长有3,5或7个字节的逻辑是什么?我可能不得不以某种方式用零划一。
回答这个问题要看你的数据的字节顺序。 Java的ByteBuffer类有一个顺序(ByteOrder)方法来设置字节顺序,但是这对于非标准长度的整数/长度值不会有帮助。
假设BB是一个字节缓冲区和长度是已知的数据长度。值变量存储结果。
这是在以下两个解决方案中使用和需要,因为Java没有无符号的数据类型(我觉得可怕的)一个辅助函数:
private static long getUnsigned(final byte b) {
if (b < 0) {
return (long) b + 256;
}
return b;
}
这里是一个小端的解决方案:
long value = 0;
for (int shift = 0; shift < length * 8; shift += 8) {
value |= getUnsigned(bb.get()) << shift;
}
这里是一个大端解决方案:
long value = 0;
for (int i = 0; i < length; ++i) {
value <<= 8;
value |= getUnsigned(bb.get());
}
我有一个“大脑放屁”和忘记了,而不是使用getUnsigned功能,您可以改为按位与字节乘0xFF得到相同的结果。 – bohney
当你施放一个号码到另一个号码,你符号扩展的最大价值位。 (换句话说,如果最高位为1,则用1填充,如果最高位为0,则用0填充)
因此,在小端中,可以找到最高位(最左边在最右边的字节位),那么你要么FF或00
实例添加一个字节,可以说你在小尾数3字节数:
0000 0000 | 0000 0000 | 1000 0000
你的最高位是1 (在最后字节的1),所以,在4个字节的符号扩展的结果是:
0000 0000 | 0000 0000 | 1000 0000 | 1111 1111
同样,如果3字节数是:
1111 1111 | 1111 1111 | 0101 1101
然后4个字节的符号扩展的版本是:
1111 1111 | 1111 1111 | 0101 1101 | 0000 0000
不想问很多,但我该如何将这些字节变成长整型? (我想我可以只考虑Java源代码,并通过自己找出来,但如果你知道,从你的头顶将是有益的THX – TraderJoeChicago
不管你多少字节需要,这个过程是一样的。!取最高位,并且将其扩展 - 它是硬件整数,短裤,字节之间如何管型,渴望 –
你为什么短期多头?这是如何定义协议? – EJP
只需三个字节并将它们串在一起,不是吗? –