使用sprintf打印十六进制值的便携方式

时间:2014-03-20 14:14:41

标签: c++ c hex portability sign-extension

我在二进制到(可打印)的hexa转换方面遇到了一些麻烦。我已经达到了编写代码的功能(对于我的系统),但是我需要知道它是否在所有系统(OS和硬件)上都是可移植的

所以这是我的函数(尝试从一段二进制文本构造一个UUID):

int extractInfo( unsigned char * text )
{
    char h[3];
    int i;

    this->str.append( "urn:uuid:" );
    for( i = 56; i < 72; i++ )
    {
        ret = snprintf( h, 3, "%02x", text[i] );
        if( ret != 2 )
            return 1;
        this->str.append( h );
        if( i == 59 || i == 61 || i == 63 || i == 65 )
            this->str.append( "-" );
    }

    return 0;
}

据我所知,由于符号扩展程序,如果我使用 char 而不是 unsigned char ({{3 }})。分别接受和修改。

但我遇到了更多这样做的变种:C++ read binary file and convert to hex,我真的迷路了。在放松的代码中:

sprintf(hex, "%02x", (unsigned int) buffer[0] & 0xff);

我不明白为什么,虽然数组是unsigned char(在原始发布的代码中定义,由提问的人),需要转换为 unsigned int ,并且在要转换的字节上还有一个按位AND ...

所以,由于我不太了解符号扩展的事情,你能告诉我至少我编写的代码是否适用于所有系统?

1 个答案:

答案 0 :(得分:1)

因为printf不是类型安全的,所以它希望每个格式化说明符都有一个特殊大小的参数。 如果您使用一些需要int大小类型的格式化字符,那么你必须将你的角色参数转换为unsigned int

"%x"说明符需要unsigned int。