2014-10-07 2 views
1

다음과 같이 디스크 액세스를위한 쉬운 함수를 작성하려고합니다. 을 적절하게 결정할 수 없습니다.; 버퍼를 데이터 형식으로 캐스팅하거나 바이트 단위로 비트 단위로 수행합니다. 앞으로는 좀 더 엔디안 친화적 인 제품을 선택할 계획입니다. 그 중 하나가 인 이유가 분명한 이유가 무엇입니까??파일에서 N 바이트를 읽은 다음 정수로 변환하는 방법

#include <pstdint.h> 

... 

uint16_t file_read_int8(FILE* fp) { 
    char buffer[2]; 
    fread(buffer,1,2,file); 

    // this? 
    return *((uint16_t *)buffer); 

    // or this? 
    return buffer[0] | (buffer[1]<<8); 
} 
+0

어느 것도 올바르게 작동하지 않습니다. char buffer [3] = {0} '... return atoi (buffer)와 같은 것을 사용하십시오. – user3629249

답변

1

어느 쪽이든 사용할 수 있습니다. 첫 번째는 파일을 읽고 쓰는 데 동일한 아키텍처가 사용되었다고 가정합니다 (빅 엔디 언 대 리틀 엔디안). 두 번째 방법은 리틀 엔디안 (Intel) 형식을 가정합니다. 첫 번째 옵션은 옵티마이 저의 성능에 따라 더 빠를 수도 있습니다. 두 번째 아키텍처는 모든 아키텍처에서 작동해야하므로 우선적으로 사용할 수 있으므로 파일 형식이 "크로스 플랫폼"이 될 수 있다고 생각합니다. 즉 아키텍처가 파일을 만들었고 아키텍처가 파일을 읽을 수 있음을 의미합니다.

+0

감사합니다. 그래서 당신은 주조가 CPU의 아키텍처에 상관없이 작동 할 것이라고 말했습니까? –

+0

이전 메모는 신경 쓰지 않고;) 두 번째 바이트를 조작 할 수 있기 때문에 두 번째 바이트를 선호합니다. 바이트로 작업하는 것이 가장 안전한 방법입니다. 감사합니다. –

관련 문제