C 打包两个8位值

C 打包两个8位值,c,bytearray,type-conversion,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; } int main(int argc,char**argv) { char buf[2]={0xd,0x1f}; 无符号整数a;

我遇到了一个简单的问题。代码如下:

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;
}
int main(int argc,char**argv)
{
char buf[2]={0xd,0x1f};
无符号整数a;
a=((buf[1]您需要

char buf[2] = {0xfd, 0x01};
也就是说,你需要从右到左“打包”这些比特

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


0x1FD
=
0x01FD
=
(0x01字符是8位的,因此它由两个十六进制数字表示


如果要在变量
a
中使用
0x1FD
,则应使用
0xfd
0x01
初始化数组。您需要删除空位:

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

    return (unsigned) ((bytes[1] << shift) | bytes[0]);
}
unsigned pack(字符字节[2])
{
字符移位=8;
if(字节[0]<32)
移位=4;


返回(无符号)((字节[1]程序按照您的要求执行。您困惑的根源在于
0xd
常量,它实际上是
0x0d
,因为
char
是八位的。按照您的方式将其与
0x1f
一起打包应该会产生
0x1f0d
,确实如此。

您应该将其与32进行比较,而不是128。但最重要的是,它是在OP问题上完全是误导性的。@DidierTrosset你是对的,我应该将其与32进行比较。然而,OP表示他想要的是打包,以便得到他想要的结果,而不是改变输入以获得他想要的输出。这非常适合这两种情况。@RichardJ.RossIII:看起来不错ut假设字节[0]=0x2F;。则它不会work@LeoMessi你希望它输出什么?对我来说,输出是
1F2F
。OP不想改变他的输入,他想得到不同的输出。@Richard:我们真的不知道,是吗。@RichardJ.RossIII:我敢打赌。我从多年来担任技术支持的工作中学到了这一点在调试代码之前,您需要调试开发人员。:-)您本可以更详细一些,但在阅读DasbLinkedLight答案后,我也理解了您的答案。两者都投票。@Richard:您是对的。.无法更改输入。.对于给定的输入,我需要0x1FD(509)我不清楚你到底想做什么。顺便说一句@AdamLiss,我知道移位和/或方法,但我不认为Leo想做什么是清楚的。如果你需要509,为什么要写0xd,0x1f?为什么不使用整数值或数组?这段代码试图解决什么问题?Leo,@dasblinkenlight在正确的轨道上吗?你只是想ck(忽略零)十六进制值?通读答案时,似乎有些混乱。是否要对答案进行打包,以便删除
0x0d
中的四个最高有效位(根据“预期”输出),或者您只是想将两个字节压缩到a的最低有效16位?只是想确认一下:输入无法更改…啊,您发现了混淆。谢谢。@dasblinkenlight:这就是我试图假设它工作的原因。我希望输出是正确的0x1FD@LeoMessi那么,您想如何处理
0x0D
的前四位呢?For例如,如果
buf[2]={0xad,0x1f}
,您的预期输出是什么?@dasblinkenlight:0x1FAD(8109)@LeoMessi如果
{0xad,0x1f}
打包为
0x1FAD
,为什么不应该
{0x0d,0x1f}
打包为
0x1F0D
然后?不可能删除
0x0d
的前导零,因为您无法区分输出与编码的
{0x01,0xfd}
然后。