1. 程式人生 > >讀取二進位制檔案到txt,包括大小端轉換

讀取二進位制檔案到txt,包括大小端轉換

不多說,直接上程式碼

#include<stdio.h>
#include<stdlib.h>
#include<fstream>
#include <iomanip>
#include <vector>
#include<math.h>
using namespace std;
#define L  101       
#define M  102    
#define N  103


void OnChange(float InParam, float &OutParam)
{
union
{
char ch[4];
float iTemp;
}u,r;
u.iTemp = InParam;
r.ch[0] = u.ch[3];
r.ch[1] = u.ch[2];
r.ch[2] = u.ch[1];
r.ch[3] = u.ch[0];
OutParam = r.iTemp;
}
int main()
{
   ofstream outfile("faultLabel.txt");
   FILE *fp;
   fp=fopen("faultLabel.dat","rb");
   float ***v;
   v=(float***)malloc(N*sizeof(float**));


   for (int i=0;i<N;i++){
  v[i]=(float**)malloc(M*sizeof(float*));//分配空間,每個二級指標又指向m個一級指標
  for (int ii=0;ii<M;ii++){
  v[i][ii]=(float*)malloc(L*sizeof(float));//分配空間,每個一級指標指向長度為l的一維陣列
  for ( int iii=0;iii<L;iii++){
  v[i][ii][iii]=0;
  fread(&v[i][ii][iii],4,1,fp);//讀二進位制速度檔案
  float temp;
  temp=0;
  OnChange(v[i][ii][iii],temp);
  outfile<<setiosflags(ios::fixed)<<setw(5)<<temp<<" ";
  }    
  outfile<<endl;
  }
   }
fclose(fp);
return 0;
}

對於其他型別只需要修改對應的union型別就可以了,具體實現如下:

void OnChange(short InParam, short &OutParam)
{
union
{
char ch[2];
unsigned short iTemp;
}u,r;
u.iTemp = InParam;
r.ch[0] = u.ch[1];
r.ch[1] = u.ch[0];
OutParam = r.iTemp;
}


void OnChange(int InParam, int &OutParam)
{
union
{
char ch[4];
int iTemp;
}u,r;
u.iTemp = InParam;
r.ch[0] = u.ch[3];
r.ch[1] = u.ch[2];
r.ch[2] = u.ch[1];
r.ch[3] = u.ch[0];
OutParam = r.iTemp;
}


void OnChange(float InParam, float &OutParam)
{
union
{
char ch[4];
float iTemp;
}u,r;
u.iTemp = InParam;
r.ch[0] = u.ch[3];
r.ch[1] = u.ch[2];
r.ch[2] = u.ch[1];
r.ch[3] = u.ch[0];
OutParam = r.iTemp;
}


void OnChange(double InParam, double &OutParam)
{
union
{
char ch[8];
double iTemp;
}u,r;
u.iTemp = InParam;
r.ch[0] = u.ch[7];
r.ch[1] = u.ch[6];
r.ch[2] = u.ch[5];
r.ch[3] = u.ch[4];
r.ch[4] = u.ch[3];
r.ch[5] = u.ch[2];
r.ch[6] = u.ch[1];
r.ch[7] = u.ch[0];
OutParam = r.iTemp;
}