2013-09-29 4 views
1

단일 정밀도 값이 n 인 이진 파일이 있습니다. 필자는 데이터를 쓸 때 사용 된 형식이 빅 엔디안 (big-endian)이라는 것을 알고 있습니다. 데이터를 float vector (아래 코드의 'mainvector')로 읽어 들이면 기본적으로 리틀 엔디안 형식으로 데이터가 읽혀집니다. 유래 자체에 대한 엔디 언 및 변환에 대한 많은 논의가있다C++ 읽기 (빅 엔디안) 이진 float

ifstream inputfile("filepath",ifstream::in|ifstream::binary) 
inputfile.read(reinterpret_cast<char*>(&mainvector[0]), n*4); 
inputfile.close() 

: 나는 데이터를 읽을 다음 사용합니다. 그러나 이것은 엔디안 문제를 다루어야하는 첫 번째 문제이며 이용 가능한 모든 정보가 다소 압도적입니다. 이 과정에서 바이트가 반전된다는 사실을 알게되었습니다 (빅 엔디안 대 리틀 엔디안).

내 바이너리 데이터의 기본 리틀 엔디안 처리를 빅 엔디안으로 변경하거나 원래 데이터를 가져 오기 위해 메인 벡터을 처리하기 위해 통합 할 수있는 라이너가 있습니까? 또는 n 값 각각의 바이트 순서를 수동으로 되돌려 야합니까?

업데이트 :이 경우에는 한 줄짜리 줄이 없어 보입니다. 개별적으로 바이트 순서를 변경하는 방법입니다! 그 방법은 Mats와 다른 곳에서 논의됩니다 (예 : here).

답변

1

각 값을 개별적으로 되돌려 야합니다. 따라서이 같은 작동합니다 :

#include <iostream> 
#include <fstream> 

int main() 
{ 
    const int n = 34; 
    float mainvector[n]; 

    std::ifstream inputfile; 

    for(int i = 0; i < n; i++) 
    { 
    unsigned char temp[sizeof(float)]; 
    inputfile.read(reinterpret_cast<char*>(temp), sizeof(float)); 
    unsigned char t = temp[0]; 
    temp[0] = temp[3]; 
    temp[3] = t; 
    t = temp[1]; 
    temp[1] = temp[2]; 
    temp[2] = t; 
    mainvector[i] = reinterpret_cast<float&>(temp); 
    } 
} 

당신은 순서를 교환 기능 내장의 일부 양식을 사용 할 수도 있지만, 그것은 특정 컴파일러 것 ...

+0

'reinterpret_cast'가 포인터 타입으로 변환 할 수 있다고 생각했습니다 ... – 0x499602D2

+0

@ 0x499602D2 : 방금 편집 한 코드가 -Wall로 gcc 4.6.3으로 컴파일되었습니다.'mainvector'가 사용되지 않았다고 불평하지만 그 외에는 아무런 문제가 없습니다. "big endian float file"이 없으므로 테스트 할 수 없습니다. –

+0

@Mats : Works, incl. 'reinterpret_cast'의 사용법. – umayfindurself

0

유닉스 시스템은 routines for this이 (및 다른 시스템들도 포함될 수 있음). 코드는 this answer에 표시됩니다. 컴파일러는 타입 앨리어싱을 지원해야합니다 (float에 대한 참조가 int에 대한 참조로 캐스팅되거나 반대로 플로팅에 대한 참조가 캐스팅 될 수 있도록).

+0

루틴에 대한 링크가 관련이없는 것 같습니다. 어쩌면 [this] (http://linux.die.net/man/3/endian)이 당신이 의미 한 것일 수도 있습니다. –