将十六进制数据输出到文件的正确方法是什么?

sup*_*ame 0 c++ hex fstream bmp

我已经读到了[ostream] << hex << 0x[hex value],但我有一些问题

(1)我将我的文件流定义output为十六进制输出文件流output.open("BWhite.bmp",ios::binary);,因为我这样做,是否会使操作中的hex参数变为output<<冗余?

(2)如果我有一个整数值,我想存储在文件中,我使用了这个:

int i = 0;
output << i;
Run Code Online (Sandbox Code Playgroud)

我会存储在小端或大端吗?根据执行或编译程序的计算机,endi-ness是否会发生变化?

此值的大小是否取决于它运行的计算机?我需要使用hex参数吗?

(3)有没有办法将原始十六进制数字输出到文件?如果我希望文件具有十六进制数字43,我应该使用什么?

output << 0x43output << hex << 0x43输出ASCII 4,然后输出ASCII 3.

输出这些十六进制数字的目的是为.bmp文件生成标题.

Sve*_*ven 7

格式化输出操作符<<仅用于:格式化输出.这是字符串.

因此,std::hex流操纵器告诉流将数字输出为格式为十六进制的字符串.

如果要输出原始二进制数据,请使用未格式化的输出函数,例如basic_ostream::putbasic_ostream::write.

你可以像这样输出一个int:

int n = 42;
output.write(&n, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

此输出的字节顺序取决于体系结构.如果您希望获得更多控制权,我建议如下:

int32_t n = 42;
char data[4];
data[0] = static_cast<char>(n & 0xFF);
data[1] = static_cast<char>((n >> 8) & 0xFF);
data[2] = static_cast<char>((n >> 16) & 0xFF);
data[3] = static_cast<char>((n >> 24) & 0xFF);
output.write(data, 4);
Run Code Online (Sandbox Code Playgroud)

无论平台的字节顺序如何,此示例都将输出32位整数作为little-endian.char但是,如果签名,请小心转换回来.


pho*_*xis 7

你说

"有没有办法将原始十六进制数字输出到文件?如果我希望文件具有十六进制数字43,我应该使用什么?"

"原始十六进制数字"取决于您对一组位的解释.考虑以下:

 Binary  :    0 1 0 0 1 0 1 0
 Hex     :    4 A
 Octal   :    1 1 2
 Decimal :    7 4
 ASCII   :    J
Run Code Online (Sandbox Code Playgroud)

以上所有代表相同的数字量,但我们对它的解释不同.

因此,您只需将数据存储为二进制格式,即由数字表示的精确位模式.

EDIT1

当您以文本模式打开文件并在其中写入数字时,例如在您编写时 74(如上例所示),它将存储为两个ASCII字符'7''4'.为避免这种情况,请以二进制模式打开文件ios::binary并将其写入write ().检查http://courses.cs.vt.edu/~cs2604/fall00/binio.html#write