Dot-Net

C#/.NET - 自定義二進製文件格式 - 從哪裡開始?

  • April 29, 2015

我需要能夠以自定義二進製文件格式儲存一些數據。我以前從未設計過自己的文件格式。它需要是一種在 C#、Java 和 Ruby/Perl/Python 世界之間穿梭的友好格式。

首先文件將包含記錄。一個 GUID 欄位和一個 JSON/YAML/XML 數據包欄位。我不確定用什麼作為分隔符。逗號、製表符或換行符之類的東西似乎太脆弱了。Excel 是做什麼的?還是 XML 之前的 OpenOffice 格式?您應該使用 ASCII 字元 0 還是 1。不知道從哪裡開始。有沒有關於這個主題的文章或書籍?

此文件格式稍後可能會擴展為包含“標題部分”。

注意:首先我將在 .NET 中工作,但我希望該格式易於移植。

更新:

“數據包”的處理可能很慢,但文件格式內的導航不能。所以我認為 XML 不在討論範圍內。

我將嘗試添加一些用於創建可移植二進製文件格式的一般提示。

請注意,發明二進製文件格式意味著記錄其中的位必須如何傳輸以及它們的含義。它不是編碼,而是文件。

現在提示:

  1. 決定如何處理字節序。好的和簡單的方法是一勞永逸地決定它。在普通 PC(即 x86)上使用時,選擇最好是小端,以節省轉換(性能)。
  2. 創建標題。是的,總是有一個標題是個好主意。文件的第一個字節應該能夠告訴你,你在搞亂什麼格式。
  • 從能夠辨識您的格式的魔法開始(ASCII 字元串就可以了)
  • 添加版本。添加文件格式的版本不會有什麼壞處,它可以讓您稍後進行向後兼容。
  1. 最後,添加數據。現在,數據的格式將是特定的,它將始終基於您的確切需求。基本上,數據將儲存在某種資料結構的二進制映像中。資料結構是您需要提出的。

如果您需要通過某種索引隨機訪問您的數據,B-Trees是一種選擇,而如果您只需要大量的數字來將它們全部寫入然後讀取它們,那麼“數組”就可以解決問題。

此外,您可以使用TLV(類型-長度-值)概念來實現前向兼容性。

看看使用“協議緩衝區”怎麼樣?設計為一種高效、可移植、版本兼容的通用二進制格式,它為您提供Google庫中的 C++、Java 和 Python,以及社區埠中的 C#、Perl、Ruby 和其他?

請注意, Guid 沒有特定的數據類型,但您可以使用(基本上) a 將其作為消息填充byte[]

通常對於 .NET 工作,我會推薦protobuf-net (但作為作者,我有些偏見) - 但是,如果您打算稍後使用其他語言,則使用 Jon 的dotnet-protobufs可能會做得更好(長期);這將為您提供跨平台的熟悉 API(其中 protobuf-net 使用 .NET 習語)。

引用自:https://stackoverflow.com/questions/794977