2013-05-04 68 views
0

打包任意位數的好方法是什麼?我有已知只包含某些字符並想要加密的句子。因此,一個選項是使用較少的位來表示這些字符並加密過程中的字符。打包任意位數

我看着std :: bitset,但它需要我指定bitset的大小作爲常量,這是不會的。

我還想知道如何將壓縮比特轉換回字符來遮蔽輸出。

即如果我將A包裝到1000並將B包裝到0100,則最終的8位包裝是1000 0100,這是另一個字符。

順便說一句,這是不應該的加密強大的形式在所有

+0

它不是*任何形式的加密... – 2013-05-04 14:27:21

+0

查看Base64是如何工作的。這就是將每六位「封裝」爲八位(所以三個輸入字節變成四個輸出字節)。你可以使用類似的邏輯。 – 2013-05-04 14:27:59

+0

@KerrekSB更多的是練習比其他任何東西 – user929404 2013-05-04 14:29:28

回答

0

你所尋找的是一個dynamic_bitset。這就像std::bitset,但它可以動態改變其大小。

此外,您可以使用std::vector<bool>這將做你所需要的作爲一個稍微不幸的歷史決定,作爲一個bitset實施它的副作用。

希望它有幫助。祝你好運!

0

如果你只從字面上編碼十六字母(說AP)的字母,那麼你就可以建立一個查找表:

unsigned char table[256] = {}; 
table['A'] = 0x0; 
table['B'] = 0x1; 
// ... 
table['P'] = 0xF; 

現在你可以編碼每兩個字母xy爲:

table[x] * 0x10 + table[y] 

您應該將其與獨特填充方案結合使用,以便將輸入數據填充到偶數個字母(PKCS填充的某些變體應起作用)。

0

「我還想知道如何將壓縮位轉換回字符」 這是基本的編碼理論。你可能想要一個Huffman編碼,這是一個沒有共享前綴的編碼。所以,如果A是1000,那麼沒有代碼100也不是10001

因此,您可以在二叉樹中組織符號。使用壓縮位從根節點走到葉節點,向左走0或向右走1。當你到達葉節點時,發出存儲在那裏的字符,並再次從根開始。

+0

我實際上知道這一點,但由於一些限制,我沒有提到,這是不可能的。這是一個很好的解決方案,但 – user929404 2013-05-06 13:54:50

+0

如果你有限制,不允許合理的解決方案,告訴我們!也就是說,如果你理解哈夫曼編碼背後的數學(或者一般的編碼理論),那麼將它應用到你真正的問題領域。 – MSalters 2013-05-06 14:06:40