scanf数据以十六进制格式转换为unsigned short

时间:2012-03-09 20:13:41

标签: c std

我想从包含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

请注意,第二行是错误的,我希望171AB部分)。

2 个答案:

答案 0 :(得分:3)

应该{​​{1}}。 (默认情况下,十六进制处理为无符号。)另请注意,hx的示例只会将其低四个nybbles读入无符号短整数,因此最终得到的值为ABCD0000

答案 1 :(得分:0)

转换说明符%hx(或等价的%hX)期望指向unsigned short的指针,没有十六进制转换的 signed 版本,但是前导输入流中的-登录符号将使用无符号算法进行识别和处理。

第一个65451之所以得到byte的原因是系统上签署了char类型,因此0xAB在存储到-85时会转换为byte byteprintf作为int传递给-85,具有相同的值printfunsigned short将其转换为格式说明符{的%hu {1}},产生0xFFAB65451

为避免此类问题,请在处理字节值时始终使用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;
}