繁体   English   中英

printf char 为 c 中的十六进制

[英]printf char as hex in c

我希望从下面的代码中输出类似\\9b\\d9\\c0...东西,但我得到\\ffffff9b\\ffffffd9\\ffffffc0\\ffffff9d\\53\\ffffffa9\\fffffff4\\49\\ffffffb0\\ffff ffef\\ffffffd9\\ffffffaa\\61\\fffffff7\\54\\fffffffb 我向 char 添加了显式转换,但它没有效果。 这里发生了什么?

typdef struct PT {
    // ... omitted
    char GUID[16];
} PT;
PT *pt;
// ... omitted
int i;
for(i=0;i<16;i++) {
    printf("\\%02x", (char) pt->GUID[i]);
}

编辑:只转换到(unsigned char)对我有用。 使用%02hhx ( gcc -Wall ) 时,编译器向我发出警告。 (unsigned int)没有效果。

发生这种情况的原因是您系统上的char已签名。 当您将它们传递给具有可变数量参数的函数时,例如printf (在签名的固定参数部分之外) char被转换为int ,并且它们在过程中得到符号扩展。

要解决此问题,请将值unsigned charunsigned char

printf("\\%02hhx", (unsigned char) pt->GUID[i]);

演示。

用:

printf("\%02hhx", pt->GUID[i]);

因为printf()是一个可变参数函数,它的参数被提升为int hh修饰符告诉printf()相应值的类型是unsigned char而不是int

改为转换为unsigned char ,以避免前导 1 位被解释为负值。

我注意到当数字大于 99x 时,你得到了 F。

我写这个来测试它并在http://www.cplusplus.com/reference/cstdio/printf/发现了 hh 前缀

#include "stdio.h"

char GUID[16];

int main() {
int i;
for(i=0;i<16;i++) {
    GUID[i]=i*i;
}
for(i=0;i<16;i++) {
    printf("\\%02.2hhx\n", GUID[i]);
}
return 0;
}

在所有平台上使用一个小的自己的实现来解决这个问题:

char hex[] = "0123456789abcdef";

void printHex(unsigned char byte) {
    printf("%c%c", hex[byte>>4], hex[byte&0xf]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM