在C中写入9位二进制数据

时间:2013-10-07 13:52:17

标签: c binary bit

我正在尝试写入不适合8位的文件二进制数据。根据我的理解,如果您可以将其分组为预定长度8,16,32,64,则可以编写任意长度的二进制数据。 有没有办法只将9位写入文件?或两个9位的值?

我有一个范围内的值 - + 32768和范围+ -256中的3个值。什么是节省大部分空间的方法?

谢谢

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和/或操作与最后/下一个字节组合。

我希望这个非常抽象的描述可以帮助你。