如何将十六进制字面写入文件?

问题描述 投票:1回答:1

我有一点问题,我想写一些像0xff这样的文件,我已经做到了:

ofstream file;
file.open(this->dbFile, ios::app | ios::binary);
const char prefix = 0xff;
file.write(&prefix, sizeof(char));

前面的例子效果很好,但这不是我的问题。 我想写下前面的例子,写下十六进制字面如下:

ofstream file;
file.open(this->dbFile, ios::app | ios::binary);
file.write((const char*)0xff, sizeof(char));

但遗憾的是,第二个示例发生了运行时错误。 我知道数据转换有问题,但它是什么?

c++ hex binaryfiles
1个回答
0
投票

第一个char经常被用作非现有类型byte的同义词,但是你可以很容易地使用自己的使用语句

#include <cstdint>
using byte_t = int8_t;

将此行file.write((const char*)0xff, sizeof(char));视为ostream::Write(const byte_t* pointerToArrayOfData, std::streamsize sizeOfData)0xFF是您要写入的数据,但不是包含数据的数组的地址。 sizeof(char)=sizeof(byte_t)=1可以忽略不计,该方法旨在写入单个字节。但是,您可以使用它来序列化自定义类型

struct Point { int8_t x, y; };
array<Point, 4> myRectangle {/* */};
file.write(&myRectangle, sizeof(Point) * array.size());
file.write(&myRectangle, sizeof(array<Point, 4>));

请注意,这取决于平台,您应始终认为生成的文件只能在您创建的同一系统上读取。如果你想传输二进制数据,请考虑一些像protobuf这样的抽象。

TLDR;

using byte_t = char;
void write_binary_data(std::ostream& ostream, byte_t* data, size_t count)
{
  ostream.write(data, count);
}

using binary_data_t = std::vector<byte_t>;
void write_binary_data(std::ostream& ostream, const binary_data_t data)
{
  write_binary_data(ostream, data.data(), data.size());
}

ofstream file;
file.open(this->dbFile, ios::app | ios::binary);
write_binary_data(file, { 0xFF, 0x00, 0xFF });
© www.soinside.com 2019 - 2024. All rights reserved.