2

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

所以这是我的函数(试图从一段二进制文本构造一个 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 charC++ 读取二进制文件并转换为十六进制),我的值不会很好地打印出来。分别接受和修改。

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

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

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

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

4

1 回答 1

1

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

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

于 2014-03-20T14:29:46.500 回答