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)。你可能会发现你是从不同的方向数的。