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

Portable way of printing hexa values with sprintf

本文关键字:便携式 方法 十六进制 sprintf 打印      更新时间:2023-10-16

我在二进制到(可打印的)十六进制转换中遇到了一些麻烦。我已经达到了一个功能性(为我的系统)编写代码的方式,但是我需要知道它是否可移植在所有系统上(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 (c++读取二进制文件并转换为十六进制),我的值不能很好地打印。接受修改

但是我遇到了更多这样做的变体:从二进制文件转换到十六进制在C中,我真的迷路了。在unwind的代码段中:

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

我不明白为什么,虽然数组是unsigned char(在原始发布的代码中定义,由问问题的人),但需要转换为unsigned int,并且还需要位和上的字节转换…

所以,因为我不太理解符号扩展的事情,你能告诉我至少我写的这段代码将在所有系统上工作吗?

由于printf不是类型安全的,它期望每个格式化说明符都有一个特殊大小的参数。这就是为什么你必须将你的字符参数转换为unsigned int,如果你使用一些格式化字符,期望一个int大小的类型。

"%x"指示符需要一个unsigned int