Java从函数中剥离零

时间:2011-01-25 15:29:34

标签: java byte bitmask fold

我正试图在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限制尾随的零点?

我希望这是有道理的。

由于

2 个答案:

答案 0 :(得分:3)

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

  • 00 01 B6 02是2B60100
  • 的4字节小端
  • A0 01 30 00是3001A0的4字节小端

零在那里,但可能只是没有打印。 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);