c++ - 从 C++ 中的二进制文件读取不同字节顺序的整数

标签 c++ casting type-conversion binaryfiles endianness

我正在阅读 ESRI Shapefile , 令我沮丧的是它在不同的点使用大端和小端(例如,参见第 4 页的表格,以及第 5 到 8 页的表格)。

所以我用 C++ 创建了两个函数,每个函数一个 endianness .

uint32_t readBig(ifstream& f) {
    uint32_t num;
    uint8_t buf[4];
    f.read((char*)buf,4);
    num = buf[3] | buf[2]<<8 | buf[1]<<16 | buf[0]<<24;
    return num;
}

uint32_t readLittle(ifstream& f) {
    uint32_t num;
    f.read(reinterpret_cast<char *>(&num),4);
    //f.read((char*)&num,4);
    return num;
}

但我不确定这是最有效的方法。 可以改进这段代码吗?请记住,它会为单个 shapefile 运行数千次,甚至数百万次。因此,即使有一个函数调用另一个函数似乎也比有两个单独的函数更糟糕。使用 reinterpret_cast 或显式类型转换 (char*) 在性能上有区别吗?我应该在两个函数中使用相同的函数吗?

最佳答案

  1. 指针类型之间的转换不影响性能——在 在这种情况下,让编译器满意只是技术问题。
  2. 如果您真的要为每个 32 位单独调用 read 值,字节交换操作所花费的时间可能是 在噪音中。为了速度,你可能应该有自己的 缓冲层,以便您的内部循环不会产生任何功能 电话。
  3. 如果交换编译为单个操作码(如 bswap),那很好,但无论是否 是可能的,还是最快的选项,是特定于处理器的。
  4. 如果您真的对最大限度地提高速度感兴趣,请考虑使用 SIMD 内部函数。

关于c++ - 从 C++ 中的二进制文件读取不同字节顺序的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530497/

相关文章:

c++ - 为什么数组中对象的析构函数在被另一个对象替换时不被调用?

c++ - Visual C++ 字节 *

java - 为什么我会收到不可转换的类型错误?

java - java中如何将int转换为uint8

来自字符串的 C++ 整数

C++ 从模板参数创建元组 vector

将字符串转换为 long long C?

c# - 在 switch case 中哪个具有更好的性能,Enum 或 Int?

c# - C# 中的 Linq 查询和转换

c# - 错误的参数 c# mvc 4