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^?
.
是什么赋予了?
鉴于字符的0x7f
是CTRL-?,它看起来像它的输出memblock[0]
,作为一个字符,而不是一个十六进制值,尽管你的格式字符串.
根据我在文档中读到的内容,这实际上是有意义的.Boost::format
是一个类型安全的库,其中格式说明符指示如何输出变量,但受所述变量的实际类型的限制,该变量优先.
该文档的状态(我的粗体):
传统printf的格式化字符串:
%spec
这里spec
是一个printf
格式规范.
spec
传递格式化选项,如宽度,对齐方式,用于格式化数字的数字基数,以及其他特定标志.但是经典的类型规范标志在格式上printf
具有较弱的含义.它仅在内部流和/或格式化参数上设置适当的标志,但不要求相应的参数具有特定类型.例如:
2$x
对于printf,规范,意思是"打印参数号2,这是一个十六进制的整数",对于格式来说,仅仅意味着"打印参数2,流基础域标志设置为十六进制".
并且假设将字段标志设置为十六进制在打印时没有多大意义char
,所以它被忽略了.此外,该文件(虽然转述一点):
在
type-char
不征收有关的说法是有限制的类型集合,但只将标志与此类型设定相关.甲type-char
的p
或x
指十六进制输出,但简单地设置的六角标志在流上.
然而,我和我的同事发现,当使用
%d
描述符打印char
变量时,结果就好像使用了%c
描述符 -printf
并且boost::format
不会产生相同的结果.
连接到上述升压文档还解释说,零填充0
改性剂适用于所有类型的,不只是那些不可或缺的,这就是为什么你得到第二个0
在0x0^?
(中^?
是一个单一字符).
在许多方面,这类似于尝试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)
归档时间: |
|
查看次数: |
1402 次 |
最近记录: |