【问题标题】:Extracting certain bits from binary data从二进制数据中提取某些位
【发布时间】:2013-06-17 20:19:52
【问题描述】:

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

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

我如何能够在 java 中使用逐位将它们中的每一个提取为单独的整数值。像下面这样:

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

如果你能看到我在上面做什么..我希望前 8 个转换为一个整数,然后将下一个转换为第二个整数,依此类推.. 我认为你在 java 中使用位元来做到这一点,但我完全不确定。任何帮助表示赞赏。对不起,但我对这种事情完全陌生,真的需要帮助,谢谢!基本上 (function) 应该是这样的:

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

这是正确的......

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

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

【问题讨论】:

  • 尝试从函数中获取所有四个字节 (n = 0, 1, 2 & 3)。您可能会发现自己从不同的角度数数。

标签: java binary extract bit-manipulation bit


【解决方案1】:

在Java中,你必须处理二进制数据,一个词应该立刻浮现在你的脑海中:ByteBuffer

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

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

return (int) buf.get(byteIndex);

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

【讨论】:

    【解决方案2】:

    正如所写,您的函数正在运行并且正在产生正确的答案。第三个字节(从右边开始)是00000000。由于您将数字右移 8*n 位,然后将其与 0xFF 进行与运算,您将得到您想要的。

    当您对大于 32 (5*8 = 40) 的数字进行右移时,编译器似乎只占用该数字的后五位(或者,如果您愿意,40%32 = 8)并执行正确的转变。所以getNthByte(5, x)getNthByte(5%4, x) 相同,getNthByte(1, x) 将数字x 向右移动 8 位,然后查看底部的 8 位。

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

    我想你只是忘记了你的函数做了什么。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 2021-01-06
        相关资源
        最近更新 更多