我想从包含ABCD0000
等数据的流中fscanf到unsigned short。
适当的格式说明符是什么?我无法找到将“unsigned”和“hexadecimal”与h
(短)说明符相结合的任何方法。
以实例
为例#include <stdio.h>
unsigned short hex_input;
unsigned char byte;
int main(void) {
scanf("%hX", &hex_input);
printf("%hX\n", hex_input);
byte = hex_input >> 8;
printf("%hu\n", byte);
byte = (char)hex_input;
printf("%hu\n", byte);
return 0;
}
数据AB00
。我得到的输出是:
AB00
65451
0
请注意,第二行是错误的,我希望171
(AB
部分)。
答案 0 :(得分:3)
应该{{1}}。 (默认情况下,十六进制处理为无符号。)另请注意,hx
的示例只会将其低四个nybbles读入无符号短整数,因此最终得到的值为ABCD0000
。
答案 1 :(得分:0)
转换说明符%hx
(或等价的%hX
)期望指向unsigned short
的指针,没有十六进制转换的 signed 版本,但是前导输入流中的-
登录符号将使用无符号算法进行识别和处理。
第一个65451
之所以得到byte
的原因是系统上签署了char
类型,因此0xAB
在存储到-85
时会转换为byte
byte
。 printf
作为int
传递给-85
,具有相同的值printf
,unsigned short
将其转换为格式说明符{的%hu
{1}},产生0xFFAB
或65451
。
为避免此类问题,请在处理字节值时始终使用unsigned char
。
要将ABCD0000
转换为2个无符号短裤,可以将长度指定为4,将消耗的字节数限制为4:
#include <stdio.h>
int main(void) {
unsigned short s1, s2;
unsigned char byte;
int n = scanf("%4hx%4hx", &s1, &s2);
if (n >= 1) {
printf("s1: %hX - %u, %u\n", s1, s1 >> 8, (unsigned char)s1);
}
if (n >= 2) {
printf("s2: %hX - %u, %u\n", s2, s2 >> 8, (unsigned char)s2);
}
return 0;
}