boost :: format hex中的奇怪行为

Chr*_*art 3 c++ format hex boost boost-format

我正在尝试格式化二进制数组:char* memblock到十六进制字符串.

当我使用以下内容时:

fprintf(out, "0x%02x,", memblock[0]);
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

0x7f,
Run Code Online (Sandbox Code Playgroud)

当我尝试在这样的流上使用boost::format时:

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

我得到这样一个怪异的输出(在六所示): 0x0^?.

是什么赋予了?

pax*_*blo 8

鉴于字符0x7fCTRL-?,它看起来像它的输出memblock[0],作为一个字符,而不是一个十六进制值,尽管你的格式字符串.

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

文档的状态(我的粗体):

传统printf的格式化字符串:%spec这里spec是一个printf格式规范.

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

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

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

type-char征收有关的说法是有限制的类型集合,但只将标志与此类型设定相关.甲type-charpx指十六进制输出,但简单地设置的六角标志在流上.

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

然而,我和我的同事发现,当使用%d描述符打印char变量时,结果就好像使用了%c描述符 - printf并且boost::format不会产生相同的结果.

连接到上述升压文档还解释说,零填充0改性剂适用于所有类型的,不只是那些不可或缺的,这就是为什么你得到第二个00x0^?(中^?是一个单一字符).


在许多方面,这类似于尝试const char *在C++中输出a 以便您看到指针的问题.以下代码:

#include <iostream>
int main() {
   const char *xyzzy = "plugh";
   std::cout << xyzzy << '\n';
   std::cout << (void*)xyzzy << '\n';
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

会产生类似的东西:

plugh
0x4009a0
Run Code Online (Sandbox Code Playgroud)

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

您的特定情况下,解决方案可能只是将您char转换为int智能处理%x格式说明符的一种或其他类型:

outFile << (boost::format("0x%02x") % static_cast<int>(memblock[0]));
Run Code Online (Sandbox Code Playgroud)