打包任意位数的好方法是什么?我有已知仅包含某些字符并想要加密的句子。因此,一种选择是使用更少的位来表示这些字符并在过程中加密这些字符。
我查看了 std::bitset,但它要求我将 bitset 的大小指定为常量,这是行不通的。
我还想知道如何将打包位转换回字符以掩盖输出。
即,如果我将 A 打包到 1000 并将 B 打包到 0100,则打包的 8 位结果是 1000 0100,这是另一个字符。
顺便说一句,这根本不应该是一种强大的加密形式
打包任意位数的好方法是什么?我有已知仅包含某些字符并想要加密的句子。因此,一种选择是使用更少的位来表示这些字符并在过程中加密这些字符。
我查看了 std::bitset,但它要求我将 bitset 的大小指定为常量,这是行不通的。
我还想知道如何将打包位转换回字符以掩盖输出。
即,如果我将 A 打包到 1000 并将 B 打包到 0100,则打包的 8 位结果是 1000 0100,这是另一个字符。
顺便说一句,这根本不应该是一种强大的加密形式
“我还想知道如何将打包位转换回字符”这是基本的编码理论。您可能需要 Huffman 编码,这是一种没有共享前缀的编码。所以,如果 A 是1000
,那么就没有代码100
也没有10001
。
因此,您可以在二叉树中组织符号。使用压缩位从根向下移动到叶节点,向左移动 0 或向右移动 1。当您到达叶节点时,发出存储在那里的字符,然后再次从根开始。
您正在寻找的是一个dynamic_bitset
. 就像std::bitset
但它可以动态改变它的大小。
此外,您可以使用std::vector<bool>
which 将执行您需要的操作,作为将其实现为 bitset 的略微不幸的历史决定的副作用。
希望能帮助到你。祝你好运!
如果您实际上只编码十六个字母的字母表(例如 AP),那么您可以构建一个查找表:
unsigned char table[256] = {};
table['A'] = 0x0;
table['B'] = 0x1;
// ...
table['P'] = 0xF;
现在您可以将每两个字母编码x
为y
:
table[x] * 0x10 + table[y]
您可能应该将此与唯一填充方案结合起来,以将输入数据填充到偶数个字母(PKCS 填充的某些变体应该可以工作)。