我有一点问题,我想写一些像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));
但遗憾的是,第二个示例发生了运行时错误。 我知道数据转换有问题,但它是什么?
第一个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 });