提升::格式十六进制中的奇怪行为
Odd behavior in boost::format hex
我正在尝试格式化二进制数组: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^?
.
什么给?
鉴于0x7f
的字符是 CTRL-?,它看起来像是将memblock[0]
输出为字符而不是十六进制值,尽管您的格式字符串。
根据我在文档中阅读的内容,这实际上是有道理的。 Boost::format
是一个类型安全的库,其中格式说明符指示如何输出变量,但受所述变量的实际类型限制,该类型优先。
文档指出(我的粗体):
旧版 printf 格式字符串:
%spec
其中spec
是printf
格式规范。
spec
传递格式选项,如宽度、对齐方式、用于格式化数字的数字基数以及其他特定标志。但是printf
的经典类型规范标志在格式上的含义较弱。它只是在内部流上设置适当的标志和/或格式化参数,但不要求相应的参数是特定类型的。 例如:规范
2$x
,意思是"打印参数编号 2,这是一个整数,以六进制表示"对于 printf,仅意味着"打印参数 2,流基字段标志设置为十六进制"。
据推测,当您打印char
时,将字段标志设置为十六进制没有多大意义,因此它被忽略了。此外,来自该文档(尽管稍微转述了一下):
type-char
不会将相关参数强加为一组受限制的类型,而只是设置与此类型规范关联的标志。p
或x
的type-char
表示十六进制输出,但只是在流上设置十六进制标志。
此链接中的文本也更具体地验证了这一点:
但是,我和我的同事发现,当使用
%d
描述符打印char
变量时,结果就像使用了%c
描述符一样 -printf
和boost::format
不会产生相同的结果。
上面链接的 Boost 文档还解释了零填充0
修饰符适用于所有类型,而不仅仅是整数类型,这就是为什么您在0x0^?
中获得第二个0
(^?
是单个字符)。
在许多方面,这类似于尝试在C++中输出const char *
以便您看到指针的问题。以下代码:
#include <iostream>
int main() {
const char *xyzzy = "plugh";
std::cout << xyzzy << 'n';
std::cout << (void*)xyzzy << 'n';
return 0;
}
将产生类似以下内容:
plugh
0x4009a0
因为标准库知道 C 样式字符串是一种特例,但是,如果你告诉它们这是一个 void 指针,他们会给你一个指针作为输出。
在特定情况下,解决方案可能只是将char
转换为智能处理%x
格式说明符的int
或某种其他类型的类型:
outFile << (boost::format("0x%02x") % static_cast<int>(memblock[0]));
- 如何在openssl-ecc中获取十六进制格式的私钥
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- 以C++格式将十六进制字符串转换为十进制数
- TCP/IP - 以 C/C++ 格式发送十六进制数据包以控制中继板
- 计算 RSA 并以十六进制格式保存到文件
- 以十六进制格式表示 fp16 最小数
- 将字符串转换为十六进制格式并将"0x "附加到十六进制值
- 需要在 c++ 中以十六进制格式将字符串写入文件
- 使用字符串格式限制十六进制数字的数量
- 如何从字符中读取ASCII值并将其转换为十六进制格式的字符串
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- 在缓冲区中以十六进制格式插入一个值
- 以相同的格式将十六进制字符串转换为int
- 如何使用十六进制格式更改容器的背景颜色
- 将指纹(十六进制格式)转换为图像
- 如何使用c++从字符串中检索十六进制格式的字节值
- 提升::格式十六进制中的奇怪行为
- 将十六进制字节值转换为 DWORD (ascii) 格式
- c++插入到具有十六进制格式的流中
- 在c++中使用cout以十六进制格式打印OpenCL cl_uchar