簡體   English   中英

二進制文件中的字節到整數

[英]Bytes to integer from binary file

我想要做的:從二進制文件中讀取一系列 4 個字節,例如00000000 00000011 00000001 00000011 (這是一個隨機示例),並在我的程序中將其表示為整數。 做這個的最好方式是什么?

編輯解決方案在這里忽略了 PNG 文件格式規范的這一部分,希望這對任何發現問題的人都有用。

我正在嘗試使用 PNG 圖像格式,但無法提取 4 字節數字。 我已成功打開和打印文件的二進制表示,因此我知道我正在使用的數據沒有損壞或格式錯誤。

我已經查看了諸如從二進制文件 c++ 中讀取 16 位整數和 32 位等效項之類的問題,但我無法辨別它們是否正在讀取二進制文件中的整數,例如00000000 72 00000000或將字節讀取為整數,即我的目標是什么。

例如,第一個塊的前四個字節是00000000 00000000 00000000 0000110113

按照上述問題的示例,這應該 == 13:

int test;
img.read( (char*) &test, sizeof(test));

但它輸出218103808

我還嘗試了使用帶有字符數組和整數數據成員的聯合的方法,並得到了相同的輸出218103808

另外,在我的系統上sizeof(int)等於4

最后,為了確保它不是格式錯誤的 PNG(我不太確定),我使用 gimp 導入它,然后將其導出為一個新文件,因此是在我的系統上本地創建的。

編輯

正如我所提到的,在seekg(8)之后接下來的四個字節是00000000 00000000 00000000 00001101 read當我決定使用

bitset<32> num;
img.read( (char*) &num, sizeof(int) );

它輸出00001101 00000000 00000000 00000000我只是被這部分弄糊塗了,在這里。 就好像字節在這里顛倒了一樣。 而這串字節等於218103808

任何見解將不勝感激

請注意,218103808 是十六進制的 0x0D000000。 您可能想閱讀有關Endianess的內容

這意味着您正在讀取的數據采用大端格式,而您的平台使用小端格式。

基本上,您需要反轉 4 個字節(並且您可能希望使用無符號整數),因此您可以得到 0x0000000D,(十進制 13),您可以這樣做:

#define BSWAPUINT(x)  ((((x) & 0x000000ff) << 24) |\
                       (((x) & 0x0000ff00) << 8)  |\
                       (((x) & 0x00ff0000) >> 8)  |\
                       (((x) & 0xff000000) >> 24))
unsigned int test;
img.read( (char*) &test, sizeof(test));
test = BSWAPUINT(test);

上面的代碼只有在代碼運行在小端平台上時才有效。

要讓您的代碼獨立於您的平台是大端還是小端,您可以自己將字節組裝成一個整數,假設您知道數據格式是大端,您可以這樣做:

unsigned char buf[4];
unsigned int test;
img.read( (char*) &test, sizeof(test));
test  = (unsigned int)buf[0] << 24;
test |= buf[1] << 16;
test |= buf[2] << 8;
test |= buf[3];

或者,在 unix 系統上,您可以#include <arpa/inet.h>並使用ntohl ()

test = ntohl(test);

(以這種方式處理數據,最好使用 uint32_t 等類型,而不是stdint.h中的 int/unsigned int's )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM