0

打包任意位数的好方法是什么?我有已知仅包含某些字符并想要加密的句子。因此,一种选择是使用更少的位来表示这些字符并在过程中加密这些字符。

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

我还想知道如何将打包位转换回字符以掩盖输出。

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

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

4

3 回答 3

0

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

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

于 2013-05-06T09:45:40.713 回答
0

您正在寻找的是一个dynamic_bitset. 就像std::bitset但它可以动态改变它的大小。

此外,您可以使用std::vector<bool>which 将执行您需要的操作,作为将其实现为 bitset 的略微不幸的历史决定的副作用。

希望能帮助到你。祝你好运!

于 2013-05-04T14:30:21.047 回答
0

如果您实际上只编码十六个字母的字母表(例如 AP),那么您可以构建一个查找表:

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

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

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

您可能应该将此与唯一填充方案结合起来,以将输入数据填充到偶数个字母(PKCS 填充的某些变体应该可以工作)。

于 2013-05-04T14:31:56.103 回答