2012-09-28 18 views
1

如果你有1,2,4或8个字节,你只需要使用get(),getShort(),getInt()和getLong()。当你有奇数个字节时,如何从ByteBuffer(Little Endian)获得一个long?

有人可以帮帮忙,我应该用它来获得一个长有3,5或7个字节的逻辑是什么?我可能不得不以某种方式用零划一。

+0

你为什么短期多头?这是如何定义协议? – EJP

+0

只需三个字节并将它们串在一起,不是吗? –

回答

2

回答这个问题要看你的数据的字节顺序。 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()); 
} 
+0

我有一个“大脑放屁”和忘记了,而不是使用getUnsigned功能,您可以改为按位与字节乘0xFF得到相同的结果。 – bohney

2

当你施放一个号码到另一个号码,你符号扩展的最大价值位。 (换句话说,如果最高位为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 
+0

不想问很多,但我该如何将这些字节变成长整型? (我想我可以只考虑Java源代码,并通过自己找出来,但如果你知道,从你的头顶将是有益的THX – TraderJoeChicago

+0

不管你多少字节需要,这个过程是一样的。!取最高位,并且将其扩展 - 它是硬件整数,短裤,字节之间如何管型,渴望 –