打包两个8位值

时间:2012-04-10 14:58:48

标签: c bytearray type-conversion

我遇到了一个简单的问题。这是代码:

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)但是当我运行上述程序时,a中的输出为0x1F0D(7949)

我怎样才能做到这一点?

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

4 个答案:

答案 0 :(得分:6)

该程序执行您要求它执行的操作。混淆的来源是0xd常量,实际上是0x0d,因为char是8位。与0x1f一起打包时应该生成0x1f0d,而且确实如此。

答案 1 :(得分:3)

你需要

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

也就是说,你需要&#34;打包&#34;从右到左的位。

如果用零填充所需的值,则更清楚,因此它被写为完整字节的字符串:

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

答案 2 :(得分:2)

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

如果您想在变量0x1FD中使用a,则应使用0xfd0x01初始化数组。

答案 3 :(得分:-1)

您需要删除空位:

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

    return (unsigned) ((bytes[1] << shift) | bytes[0]);
}