【问题标题】:What is the C++ equivalent of binary.write in Golang?Golang 中 binary.write 的 C++ 等价物是什么?
【发布时间】:2017-03-06 16:01:20
【问题描述】:

我正在使用 C++ 进行项目,该项目采用了 golang 项目的许多想法。
我没有正确理解这个 binary.write 是如何从documentation 工作的,以及我如何在 C++ 中复制它。我在我的项目中被困在这条线上。

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

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

【问题讨论】:

  • e.offsets 是文件还是缓冲区?
  • @kennytm,我不是专家,但从文档中可以看出:binary.Write(destination, endian, data_to_write)
  • @ArafatK,你关心字节序方面吗?
  • @kennytm 我已经编辑了问题。
  • @EvanTeran 我已阅读文档,我正在寻找 C++ 等价物。

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


【解决方案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 回读这些内容与此类似,但如前所述,如果您真的关心字节序,那么您需要自己处理。

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

【讨论】:

  • 请检查 OP 的 cmets 问题。 Welp,我不知道,问题的范围似乎非常非 C++。
  • @kennytm,我同意,这个问题很模糊。 似乎(不是 Go 专家)binary.Write 做了类似将“结构”字段作为基本二进制序列化格式写入流的操作。我确实认为我的答案(鉴于缺乏更好的背景)是我们现在可以得到的最接近的答案。
猜你喜欢
  • 2015-04-27
  • 2014-07-27
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2023-03-30
  • 2010-09-17
  • 2011-07-26
相关资源
最近更新 更多