2010-01-13 141 views
2

我想讀取和寫入二進制文件中的n位。 例如,將接下來的n位讀入一個整數或接下來的n位 中的字符。我需要將數據進行位對齊,而不是字節對齊。從二進制文件讀取和寫入位對齊

是否有C++庫允許我這樣做?

當我使用ostream/istream時,我似乎被限制使用字節對齊的 數據。如果我想要將數據緊緊包裝,這還不夠好。

+0

爲什麼你需要緊緊地打包你的數據?您是否考慮過使用壓縮庫(例如.zlib)?這對你來說會更容易,並且佔用更少的空間。 – 2010-01-13 17:06:48

+0

你的位是否捆綁成字節對齊的塊?如果是這樣,您可以正常讀取字節,並使用位移和位掩碼獲取位。 – 2010-01-13 20:24:59

回答

1

當然,如果您自己進行位級訪問,則字節對齊的訪問「足夠好」。 :)

Here是一個「位文件」庫,聽起來像你想要的。我自己沒有測試過,但聽起來很合理簡約。

+0

鏈接死了,而源不在archve.org – MarcusJ 2015-05-04 10:12:18

+1

@MarcusJ謝謝,我換了另一個(未經測試的)面向位的I/O庫。 – unwind 2015-05-04 10:17:25

+0

謝謝,我在編寫我自己的讀取器時遇到了困難(特別是涉及到endian swapping,希望int支持而不是讀爲char等) – MarcusJ 2015-05-04 10:32:03

0

您可以使用以下步驟從二進制文件讀取位。

  1. 使用mmap將二進制數據文件映射到內存中。如果文件大小不是字節的倍數,那麼在映射的內存區域的末尾會有填充位。填充位的數量可以是1到7之間的任何值。

  2. 現在,您可以使用位掩碼從存儲器映射區域讀取所需的位。請注意,您需要使用按位「與」操作。在小端和大端平臺上,位掩碼的值會有所不同。因此,代碼將不可移植,需要額外的便攜性。

  3. 此外,您可能還需要使用按位向左或向右旋轉運算符。

您還可以將映射的內存區域的一部分作爲具有位域的C++數據結構進行類型轉換。在這裏,我們需要指示編譯器不要在C++結構體中使用填充來進行字節對齊。這可以使用「#PRAGMA PACK(1)」指令來實現。同樣,具有位域的C++結構在小端和大端平臺上不可移植。

上述方法中的小變化可用於將位寫入二進制文件。

相關問題