c++ - C++ 文件 IO - ASCII 值而不是二进制值
问题描述
我想创建一个只有一个字节的单字节二进制文件:0x01。这是我用 C++ 编写的程序:
#include <iostream>
#include <fstream>
using namespace std ;
int main ( )
{
ofstream some_file ("some_file.bin", ios::out | ios::app | ios::binary);
some_file << 0x01 ;
some_file.close( );
return 0;
}
当我使用十六进制编辑器检查创建的文件时 - 我看到值 0x31 而不是 0x1。这是为什么 ?
解决方案
0x01
是一个整数文字。整数文字始终是整数类型,其等级至少为int
. 因此它们不能是类型char
(或signed char
/ unsigned char
)。
在你的情况下0x01
将有 type int
。
char
它的signed
/unsigned
变体是唯一的整数类型,它operator<<
在 anstd::ostream
上将输出由 . 中保存的值表示的单个字符char
。
对于其他整数类型operator<<
,将输出十进制表示格式的整数值。
如果要从其 ASCII 代码中打印单个字符,则需要转换0x01
为char
:
some_file << char{0x01};
或使用字符文字:
some_file << '\x01';
或者您可以使用该put
方法放置单个字符,该字符带有一个char
参数,因此会导致int
文字隐式转换为char
,然后将其打印为由值表示的一个字符:
some_file.put(0x01);
或者
some_file.put('\x01');
相反<<
,put
将直接写字符而不改变。<<
受可以在流上设置的格式选项的影响,例如可能会添加填充。如果您想绝对确定只打印单个字符而不进行更改,put
这可能是正确的选择。
推荐阅读
- powershell - 仅当没有用户远程登录时从 Job 启动 MSTSC/RDP
- javascript - 如何使用 vue.js 从 Promise 中的方法更新数据值?
- c# - TextBox 和 ComboBox 验证未按预期工作
- java - 如何获取resourceLoader int Spring
- python - Plotly函数将RGB颜色转换为RGBA?(Python)
- angular - 从字段表单中删除空格
- sql-server - 添加一个在最终提交后递增的 ID 字段
- python - Raspberry Pi 上多个 PIR 运动传感器的 Python 代码
- mysql - 如何修复查询错误
- java - 我如何创建多个按钮并将它们分区,以便所有这些按钮都出现在屏幕上