用sprintf打印十六进制值的便携式方法
Portable way of printing hexa values with sprintf
我在二进制到(可打印的)十六进制转换中遇到了一些麻烦。我已经达到了一个功能性(为我的系统)编写代码的方式,但是我需要知道它是否可移植在所有系统上(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
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 以C++读取文件并处理可能的错误的便携式方法
- GCC 7,-隐式故障警告,以及清除它们的便携式方法
- 有没有一种便携式方法可以在 C/C++ 中生成 nop 操作码?
- "永远"阻止线程的最简单便携式方法是什么?
- C 便携式方法获取u8字符串文字的值表示
- 是否有一种便携式/标准的方法可以在堆栈跟踪中获取文件名和亚麻布
- 使用 boost::asio 是一种便携式方法来查找可用端口号
- 在 C++11 中设置 std::线程优先级的便携式方法
- 在没有警告(或编译指示)的情况下进行便携式"assign within conditional expressions"的好方法?
- 检查长类型数据是否在 int 范围内的便携式方法是什么?
- 在C++中实现无操作语句的便携式方法是什么?
- 用sprintf打印十六进制值的便携式方法