2016-06-15 55 views
0

我想讀取我的文件的一些字節作爲整數值。例如,文件中包含相當於955C++如何讀取字節爲整數字節序獨立?

我可以讀取數據這樣的價值0x000003BB

ifstream input ("C:/Desktop/myFile", ios::binary); 
uint8_t buffer[4] = {0}; 
input.read((char*)buffer, sizeof(buffer)); 

但我怎麼能緩衝區數組轉換爲相應的INT-值955?如果可能的話,以獨立於字節序的方式,因爲這和大端字節順序的其他文件,但我的系統是在小端字節順序。謝謝:)

回答

1

我不知道這是最好的解決方案,但它的工作原理。

uint8_t buffer[4] = {0}; 
input.read((char*)buffer, sizeof(buffer)); 
unsigned int result = buffer[0]; 
result = (result << 8) | buffer[1]; 
result = (result << 8) | buffer[2]; 
result = (result << 8) | buffer[3]; 
+0

它沒有考慮字節序。如果我打印出data-var,我得到的值'3137536000'等於'0xBB030000',但實際上我需要獲得'0x000003BB' – Opa114

+0

@ Opa114,這個代碼不考慮endianness *,因爲它在一臺機器上工作任何字節序。有一個簡單的錯誤,這將轉換* little * endian,而不是你想要的big endian。將緩衝區索引更改爲從0到3,它將起作用。 – user2079303

+0

@ user2079303感謝您的提示! – Opa114

1

沒有必要使用的uint8_t一個數組,你可以direcly讀入一個4字節的整數:

uint32_t data; 
input.read((char*)&data, sizeof(data)); 

編輯:

此代碼的工作對我的VC++編譯器:

#include<stdint.h> 
#include<intrin.h> 
#include<iostream> 

int main() 
{ 
    uint32_t data; 
    data = 0xBB030000; 
    data = _byteswap_ulong(data); 

    std::cout << data; 
} 

如果您使用的是GCC,則需要更換_byteswap_ulong__builtin_bswap32。如果你需要獨立的代碼,你需要製作你自己的代碼(可能在這些編譯器內部函數之上)。

+0

這個工作,但它沒有考慮排序。如果我打印出data-var,我得到的值爲'3137536000',等於'0xBB030000',但我需要'0x000003BB' – Opa114

+0

這可能有所幫助:http://stackoverflow.com/a/105339/264325 – Ajay

+0

仍屬於同樣的陷阱,Ajay。 OP不知道文件是大還是小,並且他們想要通用代碼來處理這兩種情況。任何沒有指定endian的文件協議都是有缺陷的,應該返回實驗室進行重新設計,但是...... – user4581301

1

如果你的操作系統支持POSIX或者是windows,那麼你可以使用ntohl

int data; 
input >> data; 
data = ntohl(data); 
+2

在Windows上,它需要鏈接到'Ws2_32.lib'。 – Ajay