浮点的字节顺序

时间:2016-03-03 05:19:06

标签: c++ floating-point fstream endianness

我正在使用std::ios::binary在C ++中编写和读取二进制数据(std::fstream) - 这包括整数和浮点值。虽然我的代码适用于我自己的架构,但我不确定它是否可移植,即在我的机器上编写的二进制文件仍然可以正常读取具有不同字节序的机器。所以我的想法是,我将在第一个字节的二进制文件中添加一个值,该值将指示文件的字节顺序。

由于无法保证整数和浮点的字节顺序相同,我需要分别获取两种数据类型的信息。虽然使用指针算法获得整数的endianess相当简单,但我失去了如何在运行时获取float的endianess。有什么想法吗?

我的代码如下:

#include <cstdint>

#define INT_LITTLE_ENDIAN     0x01u
#define INT_BIG_ENDIAN        0x02u
#define FLOAT_LITTLE_ENDIAN   0x04u
#define FLOAT_BIG_ENDIAN      0x08u

uint8_t getEndianess(){
  uint8_t endianess = 0x00;
  uint16_t integerNumber = 0x1;
  uint8_t *numPtr = (uint8_t*)&integerNumber;
  if (numPtr[0] == 1) {
    endianess |= INT_LITTLE_ENDIAN;
  }else {
    endianess |= INT_BIG_ENDIAN;
  }
  /* TODO: check endianess for float */
  return endianess;
}

2 个答案:

答案 0 :(得分:2)

如果我们假设浮点数作为最顶部的位(如IEEE)并且它们不是,例如,如2的补码,您可以轻松地创建一个数字,否定它并检查是否第一个或者最后一个字节改变了。

答案 1 :(得分:2)

嗯,除了endianness之外,你还有非IEEE-754格式的潜力,但这无疑是罕见的。

如果你可以假设IEEE-754二进制,那么它几乎肯定会使用与整数相同的字节顺序,但你可以通过使用一个2的负幂(例如-1.0)的浮点值来检查,这将是具有非零MSbyte(包含符号和指数的一部分)和零LSbyte(包含最不重要的尾数位)。

float floatNumber = -1.0;
uint8_t *numPtr = (uint8_t*)&floatNumber;
if (numPtr[0] == 0) {
  endianess |= FLOAT_LITTLE_ENDIAN;
} else {
  endianess |= FLOAT_BIG_ENDIAN;
}