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

时间:2013-06-17 20:19:53

标签: java binary extract bit-manipulation bit

我有一个二进制数,如下所示:

00000000 00000000 00000011 00001101 = 781整数值=整数名称“已包装”

如何在java中使用bit wise提取每个值作为单独的整数值。如下所示:

int a = (function) = 00000000;
int b = (function) = 00000000;
int c = (function) = 00000011;
int d = (function) = 00001101;

如果你能看到我在那里做什么..我想把前8个变为一个整数,接下来变成第二个整数,依此类推......我认为你在java中使用了一点点但我完全不确定。任何帮助表示赞赏。对不起,我对这种事情全新,真的需要帮助,谢谢!基本上(函数)应该等于这样的东西:

packed >> 5; (I know this isn't nearly right that is why i am needing help on this)...

这个问题在2天前得到了回答,它完好无损,但现在它已经破了......我不明白为什么......这是我用来做这个的方法:

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)

我打印以下内容:

0

为什么呢?昨天这对我来说很好......但我注意到我做了:

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

它给了我第3位:

3

哪个是正确的......

tl; dr这个方法昨天工作正常现在它搞砸了我需要帮助修复它或者可能是我的错误?我不知道..昨天我输入了getNthByte(3,x),它给了我与00001101相关的正确整数值......

任何帮助都表示赞赏..也许该方法有问题?还是只是我?

3 个答案:

答案 0 :(得分:5)

在Java中,你必须处理二进制数据时,应该立刻想到一个词:ByteBuffer

final ByteBuffer buf = ByteBuffer.allocate(4); // sizeof(int)
buf.putInt(yourInt);

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

return (int) buf.get(byteIndex);

请注意,您假设您的整数是大端序;幸运的是,你说得对:Java就是这种情况。总是。无论底层架构的字节顺序如何。

答案 1 :(得分:1)

如上所述,您的功能正在运行,它正在产生正确的答案。第3个字节(从右侧开始)是00000000。由于您正在将数字移动8 * n位,然后使用0xFF进行AND运算,您就得到了所需的数据。

当你使用大于32(5 * 8 = 40)的数字进行右移时,似乎编译器只取这个数字的后五位(或者如你所愿,40%32 = 8)并且正确地改变了。因此getNthByte(5, x)getNthByte(5%4, x)相同,与getNthByte(1, x)相同,它将数字x右移8位,然后查看底部8位。

我很困惑为什么你认为getNthByte(5,x)应该返回第三个字节。你是怎么从五点到三点的?或者这是一个错字?

我想你刚忘记了你的功能。

答案 2 :(得分:1)

您已经传递了3您想要的字节,但是根据您的行

int shifted = packed >> (8 * n);

这将向右移24位,因此它将获得第一个字节,而不是最后一个字节。

要翻转字节顺序的概念,请在乘以n之前从3减去8

int shifted = packed >> (8 * (3 - n));

因此,传入3将导致0位的移位,以获得最低有效字节(00001101),而不是最高有效字节。

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

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