【问题标题】:Write 9 bits binary data in C用C写9位二进制数据
【发布时间】:2013-10-14 03:15:52
【问题描述】:

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

我在 -+32768 范围内有一个值,在 +-256 范围内有 3 个值。什么方法可以节省最多的空间?

谢谢

【问题讨论】:

  • 发布您的代码...
  • Writing bits to a file in C 的可能重复项
  • 在您可能正在使用的所有系统上,文件的长度始终为多个字节,即 8 位的任意倍数。您当然可以使用 3 个字节(24 位)写入两个 9 位值(18 位)。
  • 目前还没有代码,因为我不知道怎么做。我想在 9 位上写入 +-255 范围内的值
  • 您可以升级到下一个可用尺寸。如果您使用 +-255 范围内的整数,请使用 int16_t(两个八位字节)。如果您需要更多,请使用 int32_t,依此类推。

标签: c binary bit


【解决方案1】:

不,我认为没有任何方法可以使用 C 的文件 I/O API:s 来表示存储少于 1 个char 的数据,通常为 8 位。

如果您使用的是 9 位系统,其中 CHAR_BIT 确实是 9,那么这将是微不足道的。

如果您真正要问的是“如何使用所需的精确位数存储一个范围有限的数字”,在一个可能更大的文件中,那么这当然很有可能。

这通常称为 bitstreaming,是优化用于某些信息的空间的好方法。编码/解码比特流格式要求您跟踪实际文件中当前输入/输出字节“消耗”了多少位。这有点复杂,但不是很难。

基本上,您需要:

  • 字节流s,即您可以将字节放入的东西,例如FILE *
  • 位索引i,即一个无符号值,用于跟踪您发出了多少位。
  • 当前字节x,可以将位放入其中,每次递增i。当i 达到CHAR_BIT 时,将其写入s 并将i 重置为零。

【讨论】:

    【解决方案2】:

    您也不能以 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 位的填充,或者在写入文件之前使用更复杂的代码进一步连接位。这需要额外的代码来将位组装成字节序列。很少值得付出努力,因为目前存储空间很便宜。

    【讨论】:

      【解决方案3】:

      你可以应用base64的原则(只是扩大你的基地,而不是让它变小)。

      每个值将被写入两个字节,并通过移位和或操作与最后一个/下一个字节组合。

      我希望这个非常抽象的描述对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多