我正试图在Java中翻转一些字节,而我所拥有的函数正在为某些字节正常工作而对其他字节则失败。
我正在使用的功能是:
public static int foldInByte(int m, int pos, byte b) {
int tempInt = (b << (pos * 8));
tempInt = tempInt & (0x000000ff << (pos * 8));
m = m | tempInt;
return m;
}
实现此目的的代码是:
byte[] bitMaskArray = new byte[]{
byteBuffer.get(inputIndex),
byteBuffer.get(inputIndex + 1),
byteBuffer.get(inputIndex + 2),
byteBuffer.get(inputIndex + 3)};
int tempInt = 0;
tempInt = foldInByte(0, 3, bitMaskArray[3]);
tempInt = foldInByte(tempInt, 2, bitMaskArray[2]);
tempInt = foldInByte(tempInt, 1, bitMaskArray[1]);
tempInt = foldInByte(tempInt, 0, bitMaskArray[0]);
bitMask = tempInt;
字节是从ByteBuffer读取的,byteOrder是Little Endian。
例如,字节00 01 B6 02将bitMask设置为:2B60100 - 在我的程序中完美运行。
但是,如果字节为A0 01 30 00,则bitMask设置为:3001A0 - 它已从位掩码中指定了最后一个零。
有什么办法可以阻止Java限制尾随的零点?
我希望这是有道理的。
由于
贝
答案 0 :(得分:3)
零被剥离 - 引用的两个例子都是正确的。
零在那里,但可能只是没有打印。 System.out.print系列调用不会打印前导零位数。
我可能会提到你的方法是不必要的复杂。这是一个计算相同值的方法:
static int extractLittleEndian4(byte[] buf, int index)
{
int a = buf[index+0]&0xff, b = buf[index+1]&0xff, c = buf[index+2]&0xff, d = buf[index+3]&0xff;
return a | (b << 8) | (c << 16) | (d << 24);
}
答案 1 :(得分:0)
看起来你的字节已经填充了ByteBuffer。为什么不让ByteBuffer为你反转字节?只需将字节添加到缓冲区(如果要添加整数而不是字节,则BIG_ENDIAN是默认值),然后在读取整数之前更改顺序。
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);
如果您所做的只是颠倒字节顺序,那么让图书馆为您完成工作。如果您碰巧以整数值开头,您甚至可以这样做:
int input = ...;
int output = Integer.reverseBytes(input);