printf char as c in hex

时间:2015-05-26 16:21:54

标签: c printf

我希望从下面的代码中输出类似\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)投标为我工作。使用%02hhxgcc -Wall)时,编译器会向我发出警告。 (unsigned int)没有效果。

5 个答案:

答案 0 :(得分:6)

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

要解决此问题,请将值转换为unsigned char

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

Demo.

答案 1 :(得分:2)

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

答案 2 :(得分:2)

使用:

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

由于printf()variadic function,因此其参数为promoted to inthh修饰符告诉printf()相应值的类型为unsigned char而不是int

答案 3 :(得分:2)

我注意到当数字大于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;
}

答案 4 :(得分:-1)

使用小型自有实现在所有平台上解决此问题:

#!/bin/bash
export PATH=usr/local/bin/scrapy:$PATH
scrapy crawl flipkart -a key="$1" -o "$2"flipkart.xml
scrapy crawl myntra -a key="$1" -o "$2"myntra.xml
scrapy crawl jabong -a key="$1" -o "$2"jabong.xml

echo $PATH