2013-10-07 61 views
-2

我正在嘗試寫入不適合8位的文件二進制數據。根據我的理解,如果可以將其分組在預定義的長度8,16,32,64中,則可以編寫任意長度的二進制數據。 有沒有辦法只寫9位到文件?或者9位的兩個值?在C中寫入9位二進制數據

我有一個值在+ 32768範圍內,3個值在+256範圍內。什麼是節省大部分空間的方法?

謝謝

+6

發佈您的代碼... – Gangadhar

+1

[將位寫入C文件中]可能的重複(http://stackoverflow.com/questions/13252697/writing-bits-to-a-file-in-c) –

+0

在您可能正在處理的所有系統上,文件的長度始終是多個字節,即8位的任意倍數。您當然可以使用3個字節(24位)寫入兩個9位值(18位)。 – davmac

回答

1

不,我不認爲有采用C的文件I/O API任何方式:■表達存儲小於1 char數據,這通常是8位。

如果您使用的是9位系統,其中CHAR_BIT確實是9,那麼這將是微不足道的。

如果你真正要求的是「如何使用精確的位數存儲一個有限範圍的數字」,在一個可能更大的文件中,那當然是非常有可能的。

這通常被稱爲bitstreaming並且是優化用於某些信息的空間的好方法。編碼/解碼比特流格式要求您跟蹤實際文件中當前輸入/輸出字節「消耗」了多少位。這有點複雜,但不是很難。

基本上,你需要:

  • 字節流s,即東西,你可以把字節到,如FILE *
  • 位索引i,即一個無符號值,用於跟蹤您發送了多少位。
  • 當前字節x,其中可以放入比特,每次遞增i。當i達到CHAR_BIT時,將其寫入s並將i重置爲零。
-1

你可以應用base64的原理(只是擴大你的基數,而不是縮小)。

每個值將被寫入兩個字節,並通過shift和/或操作與最後/下一個字節組合。

我希望這個非常抽象的描述可以幫助你。

0

無法將值存儲在-256到+256的範圍內,也不能以9位存儲。這是513個值,而9個比特只能區分512個值。

如果您的實際範圍爲-32768至+32767和-256到+255,那麼你可以使用位字段將其打包成一個單一的結構:

struct MyStruct 
{ 
    int a : 16; 
    int b : 9; 
    int c : 9; 
    int d : 9; 
}; 

對象如這仍然會四捨五入爲整數個字節,因此上面在典型系統上將有六個字節,因爲它總共使用了43位,而下一個整數的八位字節有48位。

您可以接受43位的填充爲48或在寫入文件之前使用更復雜的代碼進一步連接位。這需要額外的代碼將位組裝成字節序列。由於存儲空間目前價格便宜,因此很少付出努力。