2017-04-11 38 views
0

我有一個關於二進制數據文件的簡單(也許是愚蠢的)問題。如果使用簡單類型(int/float/..),很容易想象二進制文件的結構(一系列浮點數,每個浮點使用固定數量的字節寫入)。但是結構,對象和功能呢?對於每種語言,是否存在與變量名稱/屬性/方法的寫入順序有關的某種形式的對話,如果是這樣,這個順序是否可以被改變並且被定義爲cusotomized?否則,是否有某種頭文件描述了每個文件中使用的格式?C++/Python中的對象和結構的二進制文件結構

我最感興趣的是python和C/C++。例如,當我使用pickled(或gzipped)文件時,python「知道」原始對象是否具有特定的方法或屬性,而無需轉換unpickled對象或指示其類型,我總是想知道如何實現。我不知道如何在Google上查看這些內容,因爲這可能與首先設計這些語言的方式有關。任何指針將不勝感激。

+0

你是什麼意思「使用」一個醃製文件? –

回答

2

它被稱爲序列化 - 因爲它是關於將您的內存數據結構序列化爲線性字節流文件。

基本算法類似於「遍歷字典中的所有鍵和值(或列表中的所有鍵)並將其打印到文件中」。但是你必須首先指定一個格式 - 如果你存儲一個字符串,你怎麼知道它何時結束?那麼,你必須首先存儲它的長度,或者使用某種類型的字符串結束標記(如JSON中的")。

被廣泛用於自定義數據的一些序列化格式是JSON,YAML,XML,MessagePack,谷歌協議緩衝器...

爲了瞭解這是如何工作的必須在msgpack specCap'n'Proto Encoding Spec看看例如(第'n'Proto是另一種序列化格式,有點低級)。

對於Python醃菜,有PEP 3154協議4規範,當然還有source code of the picke module

+0

謝謝你的解釋!這清除了它.. – vphenix

1

二進制文件包含數據。

有大量的二進制文件的數據佈局。一些示例是JPEG,可執行文件,字處理器,原始文本和存檔文件。

一個文件可能有一個擴展名可能表示佈局。例如,「.png」很可能會遵循PNG格式。 「bin」或「dat」擴展名是通用的。可以壓縮文件並用「png」擴展名命名存檔。

如果沒有文件擴展名或操作系統不存儲文件的類型,則文件的格式基於發現(或嘗試隨機格式)。某些文件格式具有完整性值以幫助驗證正確性。瞭解完整性值及其計算方式可幫助對格式類型進行分類。再次,沒有保證。

順便說一句,文件格式獨立於用來閱讀它們的語言。人們可以使用FORTRAN或BASIC來讀取gzip文件。