2016-09-17 88 views
1

我的機器工作在小端。 我必須閱讀使用C + + std :: ios ::二進制一些文件與大端編碼。有沒有什麼標準和快速的方法來做到這一點? 就目前而言,看了原始數據後,我做到以下幾點:閱讀用bigendian編寫的文件

(讀取double)

char raw [8]; 
double d = 0; //maybe initialization is not needed 
file.read(raw,8); //4 for an int 
for(int k = 0; k < 8; k++) { 
    memcpy((void *)(((char *)(&d))+k), (const void *)(raw+j+7-k), 1); 
} 

(讀整數)

char raw [4]; 
file.read(raw,4); //4 for an int 
int i = (raw[j] << 24) | (raw[j+1] << 16) | (raw[j+2] << 8) | raw[j+3]; 
+2

'人'ntohl'人htonl' –

+0

另外'的sizeof(int)的',而不是(很可能不正確的)'4',和''而不是'8'的sizeof(雙)。 –

+0

@WilliamPursell由於他讀取一個文件,4是好的。它需要被轉換爲適合目標架構的東西,但我同意。 – JustSid

回答

1

使用htonlntohl(」主機到網絡長「和」網絡到主機長「)功能在主機和網絡字節順序之間進行轉換。網絡字節順序是大端,並且在您的體系結構中,主機字節順序是小端。

做這種比特修改時,你也應該總是使用明確大小的無符號整數類型,而不是int。您可以稍後將reinterpret_cast更改爲所需的數據類型,例如。從uint64_t開始閱讀double

uint32_t little_endian_thing; 
uint32_t big_endian_thing; 
file.read(&big_endian_thing, sizeof(uint32_t)); 
little_endian_thing = ntohl(big_endian_thing);