如何从Hex值中提取较低的字节?

时间:2015-03-19 08:17:06

标签: c hex byte extraction

我正在制作一个与串行设备通信的程序。设备正在以十六进制格式提供数据。我得到的十六进制格式是FFFFFF84,但我有兴趣提取最后两位84。那我该如何提取呢?

while(1)
{
int i;
char receivebuffer [1];
read (fd, receivebuffer, sizeof receivebuffer);  
for ( i = 0; i < sizeof (receivebuffer); i++)
{
   printf("value of buffer is %X\n\n", (char)receivebuffer[i]);

}
return 0;
}

我在receivebuffer中获取数据。请帮助谢谢。

4 个答案:

答案 0 :(得分:1)

您只是感到困惑,因为printf正在将您的数据打印为符号扩展int(这意味着系统char上的char被视为签名 - 请注意这是实现定义的。)

将您的printf更改为:

printf("value of buffer is %#X\n\n", (unsigned char)receivebuffer[i]);

或只是将receivebuffer无符号的类型:

unsigned char receivebuffer[1];

// ...

printf("value of buffer is %#X\n\n", receivebuffer[i]);

答案 1 :(得分:1)

  

设备正在以十六进制格式提供数据。

这与您的代码相矛盾。设备似乎为您提供二进制(原始)格式的数据,并将其转换为十六进制以进行打印。这是一个巨大的差异。

如果你这样做

printf("value of buffer is %X\n\n", (char)receivebuffer[i]);

char(其演员阵容不必要,因为它已经是char)被转换为int。由于您的系统已对char进行了签名,因此生成的int为负数,因此在开始时为FFF...

你可以做任何

printf("value of buffer is %X\n\n", receivebuffer[i] & 0xFF);
printf("value of buffer is %X\n\n", (unsigned char)receivebuffer[i]);
printf("value of buffer is %X\n\n", (uint8_t)receivebuffer[i]);

答案 2 :(得分:0)

设备只返回字节。它是printf,它以某种格式显示一个字节(十进制,十六进制等)。要以十六进制显示字节,您应使用“0x%02x”格式。

答案 3 :(得分:0)

你想提取最后2个字节?你需要运营商&#39;&amp;&#39;提取它:

FFFFFF84 -> 1111 1111 1111 1111 1111 1111 1000 0100
000000FF -> 0000 0000 0000 0000 0000 0000 1111 1111
---------------------------------------------------
after &  -> 0000 0000 0000 0000 0000 0000 1000 0100

所以anwser做了作业:

last2 = input & 0xFF

希望这可以帮助您理解位操作。