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

标签 c++ c hex portability sign-extension

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

所以这是我的函数(试图从一段二进制文本构造一个 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;
}

我明白,由于 sign extension,如果我使用 char 而不是 unsigned char (C++ read binary file and convert to hex ).分别接受和修改。

但我遇到了更多这样做的变体:Conversion from binary file to hex in C ,我真的迷路了。在 unwind 的一段代码中:

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

我不明白为什么,尽管数组是 unsigned char(在最初发布的代码中由提出问题的人定义),但需要转换为 unsigned int,并且还要对要转换的字节进行按位与...

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

最佳答案

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

"%x" 说明符需要一个无符号整数。

关于c++ - 使用 sprintf 打印十六进制值的便携方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22535652/

相关文章:

c - 为什么MTK只显示 'F'

c - 函数中的 Malloc 和 free(优化你的内存)

linux - 将用作字段分隔符的十六进制字符替换为管道

python - 使用采样数据时,CRC32 函数如何工作?

c++ - 本地类 : C++03 vs. C++11

c - 如何在 ARM 中使用字符串?

c++ - 递归删除预处理器宏

c++ - 2 uint32_t 之间的数学运算返回 uint64_t

c++ - 配置 OpenMPI 以在单机上运行 (Debian/Linux)

c++ - 您如何在 Visual Studio 中生成具有随机输出名称的 PDB 文件?