我想讀取和寫入二進制文件中的n位。 例如,將接下來的n位讀入一個整數或接下來的n位 中的字符。我需要將數據進行位對齊,而不是字節對齊。從二進制文件讀取和寫入位對齊
是否有C++庫允許我這樣做?
當我使用ostream/istream時,我似乎被限制使用字節對齊的 數據。如果我想要將數據緊緊包裝,這還不夠好。
我想讀取和寫入二進制文件中的n位。 例如,將接下來的n位讀入一個整數或接下來的n位 中的字符。我需要將數據進行位對齊,而不是字節對齊。從二進制文件讀取和寫入位對齊
是否有C++庫允許我這樣做?
當我使用ostream/istream時,我似乎被限制使用字節對齊的 數據。如果我想要將數據緊緊包裝,這還不夠好。
您可以使用以下步驟從二進制文件讀取位。
使用mmap將二進制數據文件映射到內存中。如果文件大小不是字節的倍數,那麼在映射的內存區域的末尾會有填充位。填充位的數量可以是1到7之間的任何值。
現在,您可以使用位掩碼從存儲器映射區域讀取所需的位。請注意,您需要使用按位「與」操作。在小端和大端平臺上,位掩碼的值會有所不同。因此,代碼將不可移植,需要額外的便攜性。
此外,您可能還需要使用按位向左或向右旋轉運算符。
您還可以將映射的內存區域的一部分作爲具有位域的C++數據結構進行類型轉換。在這裏,我們需要指示編譯器不要在C++結構體中使用填充來進行字節對齊。這可以使用「#PRAGMA PACK(1)」指令來實現。同樣,具有位域的C++結構在小端和大端平臺上不可移植。
上述方法中的小變化可用於將位寫入二進制文件。
爲什麼你需要緊緊地打包你的數據?您是否考慮過使用壓縮庫(例如.zlib)?這對你來說會更容易,並且佔用更少的空間。 – 2010-01-13 17:06:48
你的位是否捆綁成字節對齊的塊?如果是這樣,您可以正常讀取字節,並使用位移和位掩碼獲取位。 – 2010-01-13 20:24:59