boost :: format hex中的奇怪行为

时间:2015-01-19 05:05:53

标签: c++ boost format hex boost-format

我尝试将二进制数组格式化为char* memblock到十六进制字符串。

当我使用以下内容时:

fprintf(out, "0x%02x,", memblock[0]);

我得到以下输出:

0x7f,

当我尝试在这样的游戏中使用boost::format时:

std::ofstream outFile (path, std::ios::out); //also tried with binary
outFile << (boost::format("0x%02x")%memblock[0]);

我得到一个奇怪的输出(在Vi中看到):0x0^?

是什么给出了?

1 个答案:

答案 0 :(得分:7)

鉴于0x7f字符 CTRL - ?,看起来它正在输出memblock[0]作为字符而不是十六进制值,尽管你的格式字符串。

这实际上是基于我在文档中读到的内容。 Boost::format是一个类型安全的库,格式说明符指示如何输出变量,但受所述变量的实际类型的限制,优先。

documentation个州(我的大胆):

  

旧版printf格式字符串:%spec其中specprintf格式规范。

     

spec传递格式化选项,如宽度,对齐方式,用于格式化数字的数字基数,以及其他特定标志。但printf的经典类型规范标志在格式上具有弱含义

     

在内部流和/或格式化参数上设置适当的标志,但不要求相应的参数属于特定类型。,例如:规范2$x,意思是“print参数号2,这是一个十六进制的整数”,对于printf来说,仅仅意味着“打印参数2,流基础域标志设置为十六进制”,用于格式化。

并且假设将字段标志设置为十六进制在打印char时没有多大意义,所以它被忽略了。另外,从那份文件(虽然转述一点):

  

type-char 强制相关参数属于一组受限制的类型,但仅设置与此类型规范关联的标记type-char px表示十六进制输出,但只是在流上设置十六进制标记。

this link

中的文字也更具体地验证了这一点
  

我的同事和我发现,当使用%d描述符打印char变量时,结果就好像使用了%c描述符一样 - {{ 1}}和printf不会产生相同的结果。

上面链接的Boost文档还解释了零填充boost::format修饰符适用于所有类型,而不仅仅是整数类型,这就是为什么你得到第二个{{ 1}} 00字符)。


在许多方面,这类似于尝试在C ++中输出0x0^?以便您看到指针的问题。以下代码:

^?

会产生类似的东西:

const char *

因为标准库知道C风格的字符串是一种特殊情况,但是,如果你告诉它们是一个无效指针,它们会给你一个指针作为输出。

特定情况下的解决方案可能只是将#include <iostream> int main() { const char *xyzzy = "plugh"; std::cout << xyzzy << '\n'; std::cout << (void*)xyzzy << '\n'; return 0; } 转换为plugh 0x4009a0 或其他智能处理char格式说明符的其他类型:

int