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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将十六进制字面写入文件?相关的知识,希望对你有一定的参考价值。

我有一点问题,我想写一些像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 });

以上是关于如何将十六进制字面写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将这个 Objective-C 代码片段写入 Swift?

如何将 ASCII 字符的十六进制值写入文本文件?

紧急求助!!!JAVA语言下如何将二进制数字写入文件然后读出来

如何使用 C++ 以二进制模式将向量写入文件?

将用户的输入写入二进制文件

记录C#常用的代码片段