c++ - 一种在 C++ 中读取二进制文件的 Kosher 方法

标签 c++ c++11 file-io

我需要读取在小端操作系统上编写的二进制文件。提取运算符 << 不适用于二进制文件。似乎按照下面的代码行进行简单的实现可以在运行在 Intel 芯片上的 Mac OS X 上运行。我只是想知道犹太洁食是怎样的。我是否只需要在大端机器上交换字节?

    #include <istream>
    #include <cstdint>
    ...
    std::stream sfile(path, std::ios::binary);
    ...
    uint32_t iValue;
    sfile.read(reinterpret_cast<char *>(&iValue), sizeof(uint32_t));
    double dValue;
    sfile.read(reinterpret_cast<char *>(&dValue), sizeof(double)); 

最佳答案

Would I just need to swap bytes on big-endian machines?

The machine doesn't matter . C++ 整数是数字,而不是字节序列。毫不奇怪,字节序列具有字节顺序(又名字节顺序)属性。数字没有。五是五是五是五是五是五是三三是101是12.

您想从其表示形式中获取一个数字,作为具有小端字节顺序的字节序列。 C++ 有一个简单的方法来做到这一点:

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

这适用于任何机器,因为 C++ 整数在任何机器上都是数字。

对于 float ,您需要知道它们是如何编码的。字节顺序属性不足以描述这一点。在大多数主流实现中,您可以假设它们是按照 IEEE754 标准中指定的方式进行编码的。要读取这些实现中的一个,您可以从适当的字节顺序构造一个整数,然后按位将其复制到一个浮点变量中,如下所示:

uint32_t i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
float f; // assumes IEEE754 single-precision
std::memcpy(&f, &i, sizeof(i));

关于c++ - 一种在 C++ 中读取二进制文件的 Kosher 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23871829/

相关文章:

c - 创建文本文件时出现问题

java - 如何删除文件中的现有文本

具有字符串和 shared_ptr union 的 C++11 类

c++ - 在标准 (C++11) 的哪个地方说余数运算符仅适用于整数类型?

c# - 不活动应用程序的键盘快捷方式

c++ - 模拟虚方法的构造函数行为

c++ - 新的 std::map::erase() 签名 C++17

python - Python 中 truncate() 方法的行为

c++ - 检测 constexpr 函数的执行时间

c++ - 我如何在 boost::geometry 中找到 2 个多边形的接触长度?