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 << 0x43并output << hex << 0x43输出ASCII 4,然后输出ASCII 3.
输出这些十六进制数字的目的是为.bmp文件生成标题.
格式化输出操作符<<仅用于:格式化输出.这是字符串.
因此,std::hex流操纵器告诉流将数字输出为格式为十六进制的字符串.
如果要输出原始二进制数据,请仅使用未格式化的输出函数,例如basic_ostream::put和basic_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但是,如果签名,请小心转换回来.
你说
"有没有办法将原始十六进制数字输出到文件?如果我希望文件具有十六进制数字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