我正在尝试写入不适合8位的文件二进制数据。根据我的理解,如果您可以将其分组为预定长度8,16,32,64,则可以编写任意长度的二进制数据。 有没有办法只将9位写入文件?或两个9位的值?
我有一个范围内的值 - + 32768和范围+ -256中的3个值。什么是节省大部分空间的方法?
谢谢
答案 0 :(得分:1)
不,我认为没有办法使用C的文件I / O API:s来表示存储少于1 char
的数据,通常是8位。
如果您使用的是9位系统,CHAR_BIT
确实是9,那么这将是微不足道的。
如果你真正问的是“如何使用所需的精确位数来存储范围有限的数字”,在一个可能更大的文件中,那当然是非常可能的。
这通常称为 bitstreaming ,是优化用于某些信息的空间的好方法。编码/解码比特流格式要求您跟踪实际文件中当前输入/输出字节“消耗”了多少位。这有点复杂但不是很难。
基本上,你需要:
s
,即您可以将字节放入的内容,例如FILE *
。i
,即无符号值,用于跟踪您发出的位数。x
的当前字节i
,可以将比特放入其中。当i
到达CHAR_BIT
时,请将其写入s
并将i
重置为零。答案 1 :(得分:0)
您也不能以9位存储-256到+256范围内的值。这是513个值,9个位只能区分512个值。
如果您的实际范围是-32768到+32767和-256到+255,那么您可以使用位字段将它们打包成一个结构:
struct MyStruct
{
int a : 16;
int b : 9;
int c : 9;
int d : 9;
};
这样的对象仍然会被舍入到整数个字节,因此上面在典型系统上将有6个字节,因为它总共使用43位,而下一个整数8位字节有48位
您可以接受43位到48的填充,或者使用更复杂的代码在写入文件之前进一步连接位。这需要额外的代码将位组装成字节序列。由于存储空间目前很便宜,所以很少值得付出努力。
答案 2 :(得分:-1)
你可以应用base64的原则(只是扩大你的基础,而不是缩小它)。
每个值都将写入两个字节,并通过shift和/或操作与最后/下一个字节组合。
我希望这个非常抽象的描述可以帮助你。