我正在嘗試寫入不適合8位的文件二進制數據。根據我的理解,如果可以將其分組在預定義的長度8,16,32,64中,則可以編寫任意長度的二進制數據。 有沒有辦法只寫9位到文件?或者9位的兩個值?在C中寫入9位二進制數據
我有一個值在+ 32768範圍內,3個值在+256範圍內。什麼是節省大部分空間的方法?
謝謝
我正在嘗試寫入不適合8位的文件二進制數據。根據我的理解,如果可以將其分組在預定義的長度8,16,32,64中,則可以編寫任意長度的二進制數據。 有沒有辦法只寫9位到文件?或者9位的兩個值?在C中寫入9位二進制數據
我有一個值在+ 32768範圍內,3個值在+256範圍內。什麼是節省大部分空間的方法?
謝謝
不,我不認爲有采用C的文件I/O API任何方式:■表達存儲小於1 char
數據,這通常是8位。
如果您使用的是9位系統,其中CHAR_BIT
確實是9,那麼這將是微不足道的。
如果你真正要求的是「如何使用精確的位數存儲一個有限範圍的數字」,在一個可能更大的文件中,那當然是非常有可能的。
這通常被稱爲bitstreaming並且是優化用於某些信息的空間的好方法。編碼/解碼比特流格式要求您跟蹤實際文件中當前輸入/輸出字節「消耗」了多少位。這有點複雜,但不是很難。
基本上,你需要:
s
,即東西,你可以把字節到,如FILE *
。i
,即一個無符號值,用於跟蹤您發送了多少位。x
,其中可以放入比特,每次遞增i
。當i
達到CHAR_BIT
時,將其寫入s
並將i
重置爲零。你可以應用base64的原理(只是擴大你的基數,而不是縮小)。
每個值將被寫入兩個字節,並通過shift和/或操作與最後/下一個字節組合。
我希望這個非常抽象的描述可以幫助你。
無法將值存儲在-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或在寫入文件之前使用更復雜的代碼進一步連接位。這需要額外的代碼將位組裝成字節序列。由於存儲空間目前價格便宜,因此很少付出努力。
發佈您的代碼... – Gangadhar
[將位寫入C文件中]可能的重複(http://stackoverflow.com/questions/13252697/writing-bits-to-a-file-in-c) –
在您可能正在處理的所有系統上,文件的長度始終是多個字節,即8位的任意倍數。您當然可以使用3個字節(24位)寫入兩個9位值(18位)。 – davmac