0

我正在尝试在 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 将位掩码设置为:2B60100 - 这在我的程序中完美运行。

但是,如果字节为 A0 01 30 00,则 bitMask 设置为: 3001A0 - 已从位掩码中删除最后一个零。

有什么办法可以阻止 Java 删除尾随零?

我希望这是有道理的。

谢谢

托尼

4

2 回答 2

3

零没有被剥离——引用的两个例子都是正确的。

  • 00 01 B6 02 是 2B60100 的 4 字节 little-endian
  • A0 01 30 00 是 3001A0 的 4 字节 little-endian

零在那里,但可能只是没有被打印出来。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);
}
于 2011-01-25T15:48:17.673 回答
0

看起来您已经有一个 ByteBuffer 填充了您的字节。为什么不让 ByteBuffer 为你反转字节呢?只需将字节添加到缓冲区(如果要添加整数而不是字节,则默认为 BIG_ENDIAN),然后在读取整数之前更改顺序。

byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);

如果您所做的只是颠倒字节顺序,请让库为您完成工作。如果你碰巧从一个整数值开始,你甚至可以这样做:

int input = ...;
int output = Integer.reverseBytes(input);
于 2011-01-25T16:11:23.613 回答