Golang中的binary.write的C ++等价物是什么?

时间:2017-03-06 16:01:21

标签: c++ go endianness ruby-c-extension

我正在研究C ++中的项目,该项目采用了来自golang项目的许多想法  我没有正确理解这个binary.write如何在documentation中工作,以及如何在C ++中复制它。我在项目中被困在这一行。

binary.Write(e.offsets, nativeEndian, e.offset)

e.offsets的类型为*bytes.Buffer,e.offset为uint64

1 个答案:

答案 0 :(得分:1)

在C ++标准库中,通常由您来处理字节序问题。所以我们暂时跳过它。如果您只想将二进制数据写入流(如文件),则可以执行以下操作:

uint64_t value = 0xfeedfacedeadbeef;
std::ofstream file("output.bin", ios::binary);
file.write(reinterpret_cast<char*>(&value), sizeof(value));

强制转换是必要的,因为文件流处理char*,但你可以写任何你想要的字节流。

只要它们是“普通旧数据”(POD),您就可以用这种方式编写整个结构。例如:

struct T {
    uint32_t a;
    uint16_t b;
};

T value2 = { 123, 45 };
std::ofstream file("output.bin", ios::binary);
file.write(reinterpret_cast<char*>(&value2), sizeof(value2));

使用file.read阅读这些内容是类似的,但如上所述,如果你真的关心endian,那么你需要自己照顾它。

如果您正在处理非POD类型(例如std::string),那么您将需要处理更复杂的数据序列化系统。如果需要,有很多选择可以解决这个问题。