Java 从二进制数据中提取某些位

Java 从二进制数据中提取某些位,java,binary,extract,bit-manipulation,bit,Java,Binary,Extract,Bit Manipulation,Bit,我有一个看起来像这样的二进制数: packed >> 5; (I know this isn't nearly right that is why i am needing help on this)... 00000000 00000000 00000011 000011101=781整数值=整数名“打包” 如何在java中使用逐位方式将它们提取为单独的整数值。例如: int a = (function) = 00000000; int b = (function) = 0000

我有一个看起来像这样的二进制数:

packed >> 5; (I know this isn't nearly right that is why i am needing help on this)...
00000000 00000000 00000011 000011101=781整数值=整数名“打包”

如何在java中使用逐位方式将它们提取为单独的整数值。例如:

int a = (function) = 00000000;
int b = (function) = 00000000;
int c = (function) = 00000011;
int d = (function) = 00001101;
0
如果你能看到我在上面干什么。。我想把前8变成一个整数,下一个变成第二个整数,依此类推。。我认为您可以在java中使用bit-wise来实现这一点,但我完全不确定。感谢您的帮助。对不起,我对这类事情一无所知,真的需要帮助,谢谢!基本上(函数)应该等于这样的东西:

packed >> 5; (I know this isn't nearly right that is why i am needing help on this)...
这个问题在两天前为我解答了,它工作得非常好,但现在它坏了。。。我不知道为什么。。以下是我用于执行此操作的方法:

public static int getNthByte(int n, int packed) 
{
   // shift the desired bits into the last 8 bits
   int shifted = packed >> (8 * n);
   // and now get those bits
   int masked = 0x000000FF & shifted;
   return masked;
}
但当我写下这行代码时,我得到的答案是:

int x = 781;
System.out.println(getNthByte(3, x)); (Which should give me 00001101, in integer value)
我打印了以下内容:

int a = (function) = 00000000;
int b = (function) = 00000000;
int c = (function) = 00000011;
int d = (function) = 00001101;
0
为什么??昨天这对我来说很好。。。但我注意到当我这么做的时候:

System.out.println(getNthByte(5, x));
它给了我第三点:

3
哪一个是正确的

tl;博士:昨天这个方法很好用,现在一切都乱七八糟了,我需要帮助修复它,或者可能是我的错误?我不知道。。昨天我输入了getNthByte(3,x),它给出了与00001101相关的正确整数值


谢谢你的帮助。。也许这个方法有问题?还是只有我一个人?

如前所述,您的函数正在工作,并且正在生成正确的答案。第三个字节(从右侧开始)是
00000000
。由于您将数字右移了8*n位,然后将其与
0xFF
进行ANDing,因此您得到了想要的结果

当使用大于32(5*8=40)的数字进行右移时,编译器似乎只取该数字的最后五位(或者如果愿意,
40%32=8
),并使用该数字进行右移。因此
getNthByte(5,x)
getNthByte(5%4,x)
getNthByte(1,x)
相同,后者将数字
x
右移8位,然后查看底部8位

我很奇怪为什么您认为
getNthByte(5,x)
应该返回第三个字节。你是怎么从五点到三点的?还是打字错误


我想你已经忘记了你的函数做了什么。

你已经为你想要的字节传入了
3
,但是根据你的行

int shifted = packed >> (8 * n);
这将向右移动24位,因此它得到的是第一个字节,而不是最后一个字节

要改变字节顺序的概念,请先从
3
中减去
n
,然后再乘以
8

int shifted = packed >> (8 * (3 - n));
因此,传入3将导致0位移位,以获得最低有效字节(000011101),而不是最高有效字节

或者,如果您的行确实代表您想要的顺序,只需传入
0

System.out.println(getNthByte(0, x));

在Java中,当您必须处理二进制数据时,一个词会立即出现在您的脑海中:

返回第n个字节现在非常简单:

return (int) buf.get(byteIndex);

请注意,您假设您的整数是以大端顺序排列的;幸运的是,您是对的:Java就是这样。总是。无论底层架构的结尾是什么。

尝试从函数中获取所有四个字节(
n
=0、1、2和3)。你可能会发现你是从不同的方向数的。