2015-03-19 75 views
0

我正在制作一个程序来与串行设备进行通信。设备以十六进制格式向我提供数据。我得到的十六进制格式是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中的数据。请帮忙谢谢。

回答

1

你,因为printf正在打印您的数据,只是困惑的符号扩展int(这意味着你的系统charchar被视为签字 - 注意,这是实现定义)。

更改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]); 
0

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

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]); 
0
要提取的最后2个字节

?你需要操作者 '&' 解压:

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 

希望这anwser帮助您了解位操作。

相关问题