Java从函数中剥离零

Java从函数中剥离零,java,byte,bitmask,fold,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; } 字

我正试图在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;
}
字节从字节缓冲区读取,字节顺序为小端

例如,字节00 01 B6 02将位掩码设置为:2B60100-这在我的程序中非常有效

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

有没有办法阻止Java去掉尾随的零

我希望这是有道理的

谢谢


托尼

零没有被去除——引用的两个例子都是正确的

  • 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);
}
静态int-extractleendian4(字节[]buf,int索引)
{
int a=buf[index+0]&0xff,b=buf[index+1]&0xff,c=buf[index+2]&0xff,d=buf[index+3]&0xff;

返回a |(b零没有被去除——引用的两个例子都是正确的

  • 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);
}
静态int-extractleendian4(字节[]buf,int索引)
{
int a=buf[index+0]&0xff,b=buf[index+1]&0xff,c=buf[index+2]&0xff,d=buf[index+3]&0xff;

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

byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);
如果您所做的只是颠倒字节顺序,那么让库为您完成这项工作。如果您碰巧从一个整数值开始,您甚至可以这样做:

int input = ...;
int output = Integer.reverseBytes(input);

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

byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);
如果您所做的只是颠倒字节顺序,那么让库为您完成这项工作。如果您碰巧从一个整数值开始,您甚至可以这样做:

int input = ...;
int output = Integer.reverseBytes(input);

你所说的“剥离”是什么意思?在第一种情况下,一个零也是“剥离”的(2B60100而不是02B60100),但事实是,在这两种情况下,领先(无关紧要)输出掩码时不会打印零。在内部,它仍然是一个包含所有前导零的32位整数。还是我完全误解了你的问题?顺便问一下,foldInByte()中第二行的意义是什么?如果说实话,我真的不明白这个函数是如何工作的。我正试图在Java中重新排列字节,以便它们以某种方式读取无符号int,我被告知这是一种方法。当我说剥离零时,我的意思是,当我将其用作二进制位掩码/位时,我需要的数字末尾没有零阵列“剥离”是什么意思?在第一种情况下,一个零也是“剥离”的(2B60100而不是02B60100),但事实是,在这两种情况下,领先(无关紧要)输出掩码时不会打印零。在内部,它仍然是一个包含所有前导零的32位整数。还是我完全误解了你的问题?顺便问一下,foldInByte()中第二行的意义是什么?如果说实话,我真的不明白这个函数是如何工作的。我正试图在Java中重新排列字节,以便它们以某种方式读取无符号int,我被告知这是一种方法。当我说剥离零时,我的意思是,当我将其用作二进制位掩码/位时,我需要的数字末尾没有零数组我只需要做
byteBuffer.order(byteBuffer.LITTLE\ENDIAN);int mask=byteBuffer.getInt();
我只需要做
byteBuffer.order(byteBuffer.LITTLE\ENDIAN);int mask=byteBuffer.getInt();