c++ - 双字节交换

标签 c++ binaryfiles

关于同一个问题有一些讨论,但我想再问一些,

1) 下面的双字节交换代码的可移植性如何

int ReadDouble(FILE *fptr,double *n)
{
   unsigned char *cptr,tmp;

   if (fread(n,8,1,fptr) != 1)
      return(FALSE);

   cptr = (unsigned char *)n;
   tmp = cptr[0];
   cptr[0] = cptr[7];
   cptr[7] = tmp;
   tmp = cptr[1];
   cptr[1] = cptr[6];
   cptr[6] = tmp;
   tmp = cptr[2];
   cptr[2] = cptr[5];
   cptr[5] =tmp;
   tmp = cptr[3];
   cptr[3] = cptr[4];
   cptr[4] = tmp;

   return(TRUE);
} 

2) 我是否应该将 float 、符号位、尾数、指数的 3 个重要部分保留为整数,然后尝试以某种方式操纵它们。

我了解浮点表示的基础知识,作为一名机械工程师并没有那么深入,但是我需要阅读一些大端文件,而我的机器是小端。稍后我可能会担心可移植性问题。但我想了解它们,也许你可以指导我做一些更直接的事情,因为这方面的信息太多,我不知道该读哪一个。

所以在一些评论之后,这应该或多或少地以可移植的方式做到这一点,对吗?对不起 C 文件指针...

double_t ReadDouble(ifstream& source) {
  // read 
  char buf[sizeof(double_t)];
  source.read(buf, sizeof(double_t));
  // reverse and return
  reverse( buf, buf+sizeof(double_t) );
  return *(reinterpret_cast<double_t*>(buf));
}

最好的, 乌穆特

最佳答案

事情没有那么简单。仅仅因为架构对于整数是大端并不意味着它对于 float 也是大端。我听说过存储整数 big-endian 和 float little-endian 的平台。 因此,首先您应该发现源平台上 double 的实际内存表示是什么。

至于交换本身,它效率低下并且代码太多。额外的 8 字节缓冲区不会杀死你,所以为什么不这样做:

int ReadDouble(FILE* f, double* n) {
  unsigned char* nbytes = reinterpret_cast<unsigned char*>(n);
  unsigned char buf[sizeof(double)];
  if (fread(buf, sizeof(double), 1, f) != 1) return FALSE;

  for (int i = 0; i < sizeof(double); ++i) {
    nbytes[i] = buf[sizeof(double)-1-i];
  }
  return TRUE;
}

代码更少,即使您决定手动展开循环也是如此。

关于c++ - 双字节交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4367557/

相关文章:

c++ - 如何更新函数外的数组(指向指针)

c++ - 当我将数组作为参数传递时,我遇到此错误 invalid types 'int[int]' in c++

c++ - TBB 并行管道 : Filter Timing Inconsistent

用于解析包含数组格式的 protobuf 数据的二进制文件的 Python API

c - 从 C 中的二进制文件读取整数数组时中止陷阱

c++ - 了解从二进制文件中提取频率以创建哈夫曼树的逻辑

installation - 通过编辑可执行文件修复二进制文件中的库位置

c++ - decltype 和成员函数(非指针)类型

c++ - CUDA 的性能取决于声明变量

python - 定义二进制文件字符串的类型