2013-06-12 74 views
4

我第一次使用二進制文件進行處理,並且手頭有一堆頭髮。不管怎麼說,我有以下定義:將無符號整數寫入二進制文件

unsigned int cols, rows; 

這些變量可以是約500當我到他們寫入到一個二進制文件,從1任何地方,我這樣做:

myFile.write(reinterpret_cast<const char *>(&cols), sizeof(cols)); 
    myFile.write(reinterpret_cast<const char *>(&rows), sizeof(rows)); 

當我回去讀取文件,對cols = 300,我得到這個結果爲:

44 
1 
0 
0 

可有人請爲什麼我得到這個結果給我解釋一下?我不能說有什麼不對,因爲我真的認爲這是我不明白的事情。我想要做的就是將該值存儲在文件中,以便當我讀回時,我也可以讀取它。也許我這樣做,我只是不知道。

我想解釋一下這是如何工作的,以及如何獲取我放回的數據。

+0

如何'myFile'聲明? – jogojapan

+0

你應該考慮使用Boost Serialization。它將使得將任何東西歸檔到二進制文件或ASCII文件或任何你想要的東西變得非常容易:[序列化](http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html) –

+0

@jogojapan:ofstream myFile; – KirAsh4

回答

2

您尚未(尚未)顯示如何解組數據,以及如何打印您引用的文本。 44010000看起來像您寫入的數據(小數點「300」)的每個小端字節的字節十進制表示。

如果你像這樣讀取數據,它應該給你想要的效果(假設你可以接受寫入該文件的計算機與讀取該文件相同的字節序的限制) :

unsigned int colsReadFromFile = 0; 
myOtherFile.read(reinterpret_cast<char *>(&colsReadFromFile), sizeof(colsReadFromFile)); 
if (!myOtherFile) 
{ 
    std::cerr << "Oh noes!" << std::endl; 
} 
+0

不幸的是,數據正在一個完全不同的平臺上讀取,一個8位的Arduino。因此,我不僅沒有從C++獲得所有工具來讀取數據,我還必須滿足於它的8位限制。所以雖然我明白'44'''''''和'00'是正確的,我必須弄清楚如何在Arduino端翻譯這個。 – KirAsh4

+0

@ KirAsh4,我主張別人的建議考慮像boost這樣的序列化庫。 –

+1

如果你必須自己考慮'ntohl' /'ntohs' /'htons' /'htonl'/etc函數。 –

2

你只是在看一個32位整數的四個字節,在小端平臺上解釋。

300 base 10 = 0x12C

所以小字節序給你0x2C 0x01,當然0x2C=44的。

2

文件中的每個字節都有8位,因此可以表示0到255之間的值。它以小端順序寫入,低字節在前。因此,從另一端開始,將數字視爲基數爲256的數字。值爲0 * 256^3 + 0 * 256^2 + 1 * 256^1 + 44 * 256^0(其中^表示指數,而非XOR)。

1
300 in binary is 100101100 which is 9 bits long. 

但是,當你說的char *,編譯器只查找第一個1個字節(8位)

so it is 00101100(bits) of (1 00101100) = 44 
            ^^^^^^^^ 
相關問題