2013-07-30 120 views
1

我目前正在編寫一個程序,它存儲'uint16_t'數值的數組,然後將它們寫入二進制文件。由於尺寸考慮,我寫入二進制文件(因爲我將處理大量數據)。這是我到目前爲止的代碼:解析二進制到十進制

static int sizebuf=5; 
int main(int argc, const char *argv[]){ 
    uint16_t buff[sizebuf]; 
    for(int i=0; i<sizebuf; i++){ 
      buff[i]=i; 
    } 
    FILE *fpbin=fopen("test.bin","a+"); 
    fwrite(buff, sizeof(uint16_t), sizeof(buff)/sizeof(uint16_t), fpbin); 
    rewind(fpbin); 

    uint16_t buffer[sizebuf]; 
    fread(buff, sizeof(uint16_t), sizebuf, fpbin); 
    for (int i = 0; i < 5; i++) 
    { 
     printf("%" PRIu16 "\n",buffer[i]); 
    } 
    fclose(fpbin); 
    return 0; 
} 

當我檢查「TEST.bin,燒寫」輸出用「hexdump都」我得到如下:

0000000 0000 0001 0002 0003 0004 
000000a 

首先,我不是很確定我瞭解第一個「000000」和最後一個「00000a」值的存在。其次,我怎樣才能將這些值轉換回小數(即回到原始數值)?我所諮詢的來源之間的共識似乎暗示沒有這樣做的標準方式(我知道我正在處理通用二進制輸出),但是我可以如何處理我的具體轉換數據?

感謝您的幫助!


編輯: 添加的代碼 '的fread' 位之後,我接收到的輸出:

5 
0 
10416 
49150 
0 
+1

只需用'fread'將值讀回'uint16_t'。你是什​​麼意思轉換回ascii? 'printf'應該可以做到這一切。 –

+0

「返回Ascii文本」 - 那些不是「ASCII文本」開頭。你可能意思是「回到十進制符號」。 – usr2564301

+1

你確定最後一個'000000a'不在下一行嗎? – jxh

回答

-1

0000000實際上指的是行號。它不在二進制文件中,而是由您的十六進制轉儲應用程序生成。你的第二行將包含00000010,它表示每行號碼最多有16個字節。

每行以換行符結束,換行符爲ASCII 0xa。每條線都以此結束。

將每個字節轉換爲數字,然後使用itoa獲取ascii值。

+0

OP的程序沒有生成新行。 –

+0

'000000a'是第二個「行號」。這些並不是真正的行數,但它們是十六進制偏移量。第一個字節位於偏移量0000000處,在最後一行輸出後,hexdump程序顯示一行沒有內容的行,顯示下一個字節的偏移量。 –

1

第一個000000是文件的偏移量。由於該數據來自文件的開頭,所以偏移量爲0000000a是總文件大小 - 在你的情況下是10個字節(5個數組條目乘以每個條目2個字節)。通常情況下,該行將從數據開始,你確定你複製/粘貼正確嗎?

下面是我的機器的一些例子跟你的程序的輸出:

$ hexdump test.bin # traditional hexdump output 
0000000 00 00 01 00 02 00 03 00 04 00     
000000a 

$ hexdump -d test.bin # two-byte decimal output 
0000000 00000 00001 00002 00003 00004       
000000a 

$ hexdump -x test.bin # two-byte hexadecimal output 
0000000 0000 0001 0002 0003 0004       
000000a 

如果你想生成的二進制文件的一些十進制輸出,您需要提供一些格式化信息進制打印:

$ hexdump -e '5/2 "%d " "\n"' test.bin 
0 1 2 3 4 

另外,只需在程序中使用fprintf即可讓程序輸出文本而不是二進制數據。做出這樣的轉變後

for (int i = 0; i < sizebuf; i++) 
    fprintf(fpbin, "%d\n", buff[i]); 

輸出:更換fwrite通話與當您檢查使用hexdump -xod -x輸出

$ cat test.bin 
0 
1 
2 
3 
4 
+1

downvote?爲什麼? – 2013-07-30 20:10:59

+0

感謝您的回覆。事實證明,我將要處理大量的數據,所以我希望先寫入二進制文件,這樣我就不會使用文件大小。我只是在尋找一種方法從我創建的二進制文件中取回原始的十進制數據。 – MEric

+0

我認爲我的回答解決了這個問題,還是我誤解了? –

3

,你看

0000000 0000 0001 0002 0003 0004 
000000a 

最左邊一列是以十六進制偏移。這兩個實用程序都輸出沒有任何數據的最終地址,以顯示解析的字節數。

換句話說,輸出包含0x0a = 10字節,這可以被解釋爲5個16位字:0x0000 = 0,0x0001 = 1,0x0002 = 2,0x0003 = 3,和0x0004 = 4。

如果只想十六進制的話而已,每行一個字,用od -v -An -w2 -t x2。對於小數字,請使用od -v -An -w2 -t d2

請參閱man 1 odman 1 hexdump對輸出的進一步細節。