2017-09-19 3 views
0

기본적으로 Matlab 코드를 C++로 변환하려고 시도합니다. 이진 파일을 읽으면 실제로 어떻게 보이는지 모르겠습니다.C++ "ieee-be"machinefmt가있는 이진 파일 읽기

다음과 같이 matlab에 코드 단순화 : 결국

x=zeros(48,32);  
fid=fopen('pres_00.bin','r','ieee-be'); 
fseek(fid,ipos,'bof'); 
x(1:4:48,:)=fread(fid,[12,32],'single'); 

우리가 기본적으로 내가 읽을 수있는 방법은 x 배열 (행 1, 5, ..)

더블 번호를 얻을 * .bin 파일을 C++로? 나는 시도 :

file1.seekg(0, ios::end); 
int length = file1.tellg(); 
file1.seekg(ipos, ios_base::beg); 
lenght = lenght - ipos; 

char * buffer = new char[length]; 

file1.read(buffer, length); 
double* double_values = (double*)buffer; 
double test = double_values[0]; 
file1.close(); 

는 안타깝게도 "테스트"는 이진 파일에서 인코딩되는 숫자 MATLAB과 유사하지 않다. ieee-be 인코딩을 사용하여 정보를 C++로 구현하려면 어떻게해야합니까? 불행히도 바이너리 파일에 익숙하지 않습니다 ...

건배와 도움에 감사드립니다!

// 편집 :

는 아마 도움이 : 내 경우

ipos = 0 
the first hex row (offset0) (32) : 
44 7C CD 35 44 7C AD 89 44 7C E9 F2 44 7D F7 10 44 7D 9C F9 44 7B F9 E4 44 7B 3E 1D 44 7B 6C CE 

ANSI: D|Í5D|.‰D|éòD}÷.D}œùD{ùäD{>.D{lÎ 

First value in Matlab: 1.011206359863281e+03 

What my Code reads in buffer: D|Í5D|-‰.D|éòD}÷.\x10D}œùD{ùäD{>\x1dD{lÎ...... 
double test = -4.6818882332480884e-262 
+0

내가 당신의 MATLAB 코드는 '하나'정밀도 (32 비트) 그래서 플로트 아닌 더블을 읽고 생각합니다. float 배열로 읽어보십시오. –

+0

@johnelemans는 절반에 불과하지만 나머지 절반은 'be'가 아마도 사용되는 대부분의 CPU와 반대되는 빅 엔디안 (big-endian)을 의미 할 것입니다. –

답변

1

이 문제에는 두 부분이 있습니다. 첫째, 표현은 IEEE 32 비트 부동 소수점입니다. 대부분의 프로세서는 IEEE 부동 소수점을 사용하기 때문에 필요한 것은 변환을 수행하는 간단한 캐스트입니다. 이것은 모든 가공업 자로 휴대용이 아닐 것이다. 두 번째 부분은 ieee-be 사양의 be이며 바이트가 big-endian으로 저장됨을 의미합니다. 많은 프로세서 (예 : Intel/AMD)는 리틀 엔디안이므로 변환하기 전에 바이트 스왑을 수행해야합니다.

void byteswap4(char *p) 
{ 
    std::swap(p[0], p[3]); 
    std::swap(p[1], p[2]); 
} 

float to_float(char *p) 
{ 
    return *((float*)p); 
} 

는 직접보기 : https://ideone.com/IrDEJF