将01字符串转换成二进制输出到文件

今天有个学弟问我,他已经实现了哈夫曼编码,把一个字符转换成了01字符串,比如’a’=>”111″,现在要对一篇文章用哈弗曼编码压缩,也就是把每个字符都转换成01串,然后以真正的二进制形式输出到文件中,也就是说,“111”不再是三个字节(byte),而是三个二进制位(bit)。想到我上学期做软设I的时候动态哈夫曼编码最后也只是输出了01字符串,没有输出成真正的二进制,于是就顺手写了一段转换程序,算是给那个小项目做个了结吧。

其实思路是很简单的,因为C语言文件操作不能直接读写二进制位,但可以读写字节,所以我们就用一个字节做缓冲区(buffer),每次要输出一个0或1时,先把它存到这个buffer里面,当buffer存满(也就是8位都存上了我们的数据)以后,以二进制方式输出整个字节就好了。当然buffer也可以是多个字节,并且可以封装成类,以减少频繁读写文件产生的时间开销,并方便使用。为了方便演示,这里就用一个字节简单模拟了。

这里将一个bit存到buffer用的是位操作,一般地,如果要将一个整型或字符型数据data的第i位(最低位是第0位)置为1,只需将data与(1<<i),即二进制的100…000(i个0),做二进制或运算。要注意的是01串的长度很可能不是8的倍数,也就是说最后可能会剩下几位不够填满一个字节,所以最后要记得把没填满的buffer也输出(低位没动,是用0补足了)。

  • 学长能问一些您用的什么代码插件吗?

    • 我用的是Crayon Syntax Highlighter。