打包任意位数

时间:2013-05-04 14:25:38

标签: c++ encryption pack

什么是包装任意位数的好方法?我知道的句子只包含某些字符,并且想要加密。因此,一个选项是使用较少的位来表示这些字符并加密过程中的字符。

我查看了std :: bitset,但它要求我将bitset的大小指定为常量,这是不行的。

我还想知道如何将打包的比特转换回字符以模糊输出。

即如果我将A打包到1000而B打包到0100,则得到的8位打包是1000 0100,这是另一个字符。

顺便说一句,这不应该是一种强大的加密形式

3 个答案:

答案 0 :(得分:0)

您要找的是dynamic_bitset。它就像std::bitset,但它可以动态地改变它的大小。

此外,你可以使用std::vector<bool>作为稍微不幸的历史决定的副作用来实现你需要的东西。

希望它有所帮助。祝你好运!

答案 1 :(得分:0)

如果您只编码十六个字母的字母表(比如A-P),那么您可以构建一个查找表:

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

现在,您可以将每两个字母xy编码为:

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

你应该将它与一个唯一填充方案结合起来,将输入数据填充到偶数个字母(PKCS填充的某些变体应该有效)。

答案 2 :(得分:0)

“我还想知道如何将打包的比特转换回字符” 这是基本的编码理论。您可能需要霍夫曼编码,这是一种没有共享前缀的编码。因此,如果A是1000,那么就没有代码100也没有10001

因此,您可以在二叉树中组织符号。使用压缩位从根向下走到叶节点,向左移动0或向右移动1.当到达叶节点时,发出存储在那里的字符,然后再从根开始。