字节交换和C++/C.

Umu*_*bak 1 c c++ binaryfiles

我在comp.lang.c ++上做了一个帖子,得到了这个

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/afc946826945bdb1/90850f6a0e0edd2d#90850f6a0e0edd2d

但这仍然不是答案.

我对二进制读操作有点困惑.

我试图用流函数读取二进制文件.这是商业程序(ANSYS)的结果文件,我知道文件的结构,至少从手册中知道.

该文件的结构为记录,程序以fortran编写.所以结构就像

记录长度(int)虚拟整数数据(可以是int,double)虚拟整数

第一个记录是100个整数块,其中这对应于上述表示中的数据.

如果我开始读取文件并读取第一个值,即记录长度(整数),我必须交换字节以获得正确的值100.

我不明白为什么我必须交换字节,因为这个文件是在同一台机器上生成的,它们应该使用相同的系统特定例程,所以这不应该是一个问题,但似乎并非如此.还有其他事情正在发生.我无法理解这一点.软件是否可以强制交换字节,我很难理解原因?

任何评论都表示赞赏.

这是一个天真的测试用例

int main () {
  ifstream myfile;
  char intBuffer[4];
  myfile.open ("truss.rst", ios::binary);
  myfile.read(intBuffer, sizeof(int));
  //cout << *((int*)intBuffer) << endl;
  // if I do not use this portion-
  // I do not get what I want
  char *cptr, tmp;
  tmp = intBuffer[0];
  intBuffer[0] = intBuffer[3];
  intBuffer[3] = tmp;
  tmp = intBuffer[1];
  intBuffer[1] = intBuffer[2];
  intBuffer[2] = tmp;
  // -----------------------------
  cout << *((int*)intBuffer) << endl;

  myfile.close();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

最好的,美国

Sim*_*one 6

这不仅取决于您正在使用的机器.如果Fortran基础结构以big endian而不是little endian写入整数,那么无论操作系统是什么,你都必须处理它.

我建议你使用ntohl()ntohs()功能,这比你的交换程序更清晰.