自己最近在做一個涉及到內容壓縮的項目,需要把數據按照二進制的方式來處理(比如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裡最小也是一個字節,只不過能操作裡面的每一位而已。