2

我被一个简单的问题困住了。这是代码:

int main(int argc, char **argv)
{
  char buf[2] = {0xd, 0x1f};
  unsigned int a;

  a = ((buf[1] << 8) & 0xFF00) | buf[0];
  printf("%d\n",a);

  return 0;
}

a我需要的值是,0x1FD(509)但是当我运行上述程序时,输出a0x1F0D(7949).

我怎样才能做到这一点?

编辑:好的,让我澄清一下。我正在做一个项目,我收到的数据如代码片段所示。为了简化,我已将它们声明为 local 。主要是我希望将数据解释为0x1FD(509).

4

4 回答 4

6

该程序执行您要求它执行的操作。您混淆的根源在于0xd常数,实际上是0x0d,因为char是八位。将它与您一样打包在一起0x1f应该会产生0x1f0d,并且确实如此。

于 2012-04-10T15:05:33.020 回答
3

你需要

char buf[2] = {0xfd, 0x01};

也就是说,您需要从右到左“打包”这些位。

如果你用零填充所需的值,这会更清楚,所以它被写成一串完整的字节:

0x1FD= 0x01FD=(0x01 << 8) | 0xFD

于 2012-04-10T15:03:12.020 回答
2

一个 char 是 8 位,因此它由两个十六进制数字表示

如果你想0x1FD在你的变量中,那么你应该用anda初始化数组。0xfd0x01

于 2012-04-10T15:04:12.660 回答
-1

您需要删除空位:

unsigned pack(char bytes[2])
{
    char shift = 8;
    if (bytes[0] < 32)
        shift = 4;

    return (unsigned) ((bytes[1] << shift) | bytes[0]);
}
于 2012-04-10T15:04:50.843 回答