我想创建一个单字节二进制文件,其中只有一个字节: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
将具有类型 int
.
char
及其 signed
/unsigned
变体是 operator<<
的唯一整数类型。在std::ostream
上将输出 char
中保存的值表示的单个字符.
对于其他整数类型operator<<
将输出以十进制表示形式格式化的整数值。
如果要从 ASCII 代码打印单个字符,则需要强制转换 0x01
至char
:
some_file << char{0x01};
或使用字 rune 字:
some_file << '\x01';
或者您可以使用put
放置单个字符的方法,它需要 char
参数,因此将导致 int
的隐式转换字面意思为char
,然后将其打印为由值表示的一个字符:
some_file.put(0x01);
或
some_file.put('\x01');
与<<
相反, put
将直接写入字符,不做任何更改。 <<
受可以在流上设置的格式选项的影响,例如可以添加填充。如果您想绝对确定仅打印单个字符而不进行更改,put
可能是正确的选择。
关于C++ 文件 IO - ASCII 值而不是二进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59523481/