如何設計一種文件格式?
這個問題可以很簡單,也可以很復雜。
先舉個例子,如果你了解一下csv格式和txt格式就會發現,csv格式只不過是使用txt格式并把內容按照表的分列用逗號隔開了而已(然后換了個擴展名)。
那么,要設計一種文件格式,如果只是你自己用,那你想怎么存就怎么存、按什么順序存信息你自己決定就可以了,擴展名最好不要跟常用的一樣,然后保證你的程序能讀出文件內容就好。
然后我們試試更進一步,要使你自己設計的這個格式有區分性,比如,你可以要求擴展名必須為wdgs,然后這個文件第一行頭四個字節必須是542B(16進制)。為什么要這樣做?這是為了區分同樣叫wdgs的擴展名的文件究竟是不是你的文件。
然后如果按照工程角度的設計出發,后面一般會跟文件格式版本用的幾個字節,你也可以考慮設計上去,這是為了如果以后你修改了你的文件格式,還能根據版本用不同的解析方法把文件內容讀出來。
再然后還是按照工程角度出發,可以考慮加上記錄文件總大小用的幾個字節,這是為了當一個文件涉及網絡傳輸或拷貝等時,你還能大概判斷這文件是不是完整。
接下來的部分,就看你拿這文件干什么了。如果只是存鍵值對組合,那直接存就行了,加些標簽存也可以(這方面的例子參見XML和JSON的文件格式,XML有些在頭部還有明文的版本號、適用標準等等信息,json一般就只存實質內容了,就是那些鍵值對,甚至格式也直接用符號來區分了,標簽也省了。html文件也是這樣的例子)。
如果是要存圖片,那可以把像素逐個解析出來按顏色存儲,事實上,這就是BMP文件格式的做法。
看到bmp可能你又考慮jpg、png這些,這些是涉及了壓縮算法的,所以實際存在文件里時,要把文件分節分段,然后一節存圖片本身的像素摘要信息,一節存插值算法的摘要信息等等(你不明白的話,可以這樣考慮:我要存10000000000這個數,那么我可以存成“10000000000”,也可以存成“1后十個0”對吧,顯然后者比前者短了,也就是減小了文件大小)
有了分節分段這些策略以后,存個視頻什么的都不是問題了,可以把視頻存成一幀一幀的(事實上原始格式的avi就是這樣),依次類推。
這樣,你只要考慮你要存哪些東西,這些東西怎么轉變為有序的數字/文字/字節(事實上最終都是字節)以供你存的時候能記住、取的時候不會亂,這樣就能設計出你需要的文件格式了。
你要是樂意,也可以要求你的文件必須以你的名字+萬歲的UTF8編碼為結束才能被認可,哈哈,只要大家認可這格式就行。所謂你寫的程序,規則是你定的。