自己最近在做一个涉及到内容压缩的项目,需要把数据按照二进制的方式来处理(比如LZ77压缩、霍夫曼编码等),涉及到比较多的函数和功能。
但是自己做的时候发现,虽然c++提供了比较全面的二进制操作,但是主要是基于某一个数据类型进行二进制操作(比如char),而char又是默认是8位的,这对于跨字符操作不是很方便,需要做比较多的判断。
可能我表示的也不是很清楚,或者对c++的理解也有问题,但是我是希望能找到一个可以行云流水般处理二进制的方法...或者有没有比较好用的库?
有没有朋友在这方面有经验可以指点一二,感激不尽,如果有帮助,我会私戳发红包表示感谢。
巴扎黑2017-06-05 11:13:09
如果你想要大一点的字符表示范围,可以用wchar_t。
如果你想要一个可以把内存中的数据以任意一位作为一个字节的开始的类型,那肯定是不可能实现的。
但是你可以
`nl=((arr[0]&c0)>>6);
nh=((arr[1] &0x0f) << 2);
n=nh|nl;`
来把前一个字节的高2位和后一个字节的低4位拼成一个6位二进制数
给我你的怀抱2017-06-05 11:13:09
都用二进制了,还考虑字符?
二进制就应该只考虑字节吧?
压缩算法的话,很多时候是不考虑字符的,因为输入文件可能是ASCII,可能是UTF-8,可能是UTF-16(LE/BE),或者GBK等等。但是归根究底,语言的共性就是统计上存在一定规律。
比如英文中e的出现频率高,或者is这种单词出现频率高,或者se、tor之类的词缀出现频率高。
压缩的根本原理就是用尽量少的bit代表出现频率高的东西,减少冗余,所以一般来说跟字符没关系。
你多了解一下压缩算法吧,LZ77/LZ78/霍夫曼这些都是通用的压缩算法,不只局限于文本,是以bit为单位的。
说回C++,C++要求一个东西的大小编译期可知(栈分配内存编译器确定),而输入的文本运行期才知道,所以理论上没有什么很好的方法。字符集、文本编码是一个深坑,不建议跳进去。
如果你是说要以bit为单位做操作的话,自己封装一个库吧,或者boost之类的有一些库能用。毕竟CPU里最小也是一个字节,只不过能操作里面的每一位而已。