我正在制作一个与串行设备通信的程序。设备正在以十六进制格式提供数据。我得到的十六进制格式是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中获取数据。请帮助谢谢。
答案 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
希望这可以帮助您理解位操作。