C++ 打包任意数量的位

C++ 打包任意数量的位,c++,encryption,pack,C++,Encryption,Pack,打包任意数量的位的好方法是什么?我有一些只包含某些字符的句子需要加密。因此,一种选择是使用较少的位来表示这些字符,并在过程中加密字符 我查看了std::bitset,但它要求我将bitset的大小指定为常量,这是行不通的 我还想知道如何将压缩位转换回字符以掩盖输出 也就是说,如果我将A打包到1000,B打包到0100,那么打包的结果8位是1000 0100,这是另一个字符 顺便说一句,这根本不是一种强大的加密形式您要找的是。它类似于std::bitset,但它可以动态更改其大小 此外,您还可以使

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

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


我还想知道如何将压缩位转换回字符以掩盖输出

也就是说,如果我将A打包到1000,B打包到0100,那么打包的结果8位是1000 0100,这是另一个字符


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

您要找的是。它类似于
std::bitset
,但它可以动态更改其大小

此外,您还可以使用它来做您需要做的事情,作为一个有点不幸的历史决策的副作用,将它实现为一个位集


希望能有帮助。祝你好运

如果您实际上只对16个字母(比如A-p)的字母表进行编码,那么您可以构建一个查找表:

unsigned char table[256] = {};
table['A'] = 0x0;
table['B'] = 0x1;
// ...
table['P'] = 0xF;
现在,您可以将每两个字母
x
y
编码为:

table[x] * 0x10 + table[y]
您可能应该将其与独特的填充方案结合起来,将输入数据填充到偶数个字母(某些PKCS填充变体应该可以工作)。

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


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

这不是任何形式的加密……请查看Base64的工作原理。这就是将每六位“打包”为八位(因此三个输入字节变成四个输出字节)。你可以使用类似的逻辑。@KerrekSB这比像无损压缩这样的任何东西更像是一种练习@KerrekSB,这是在其他程序之后完成的。这不是唯一的事情。我更关心的是如何在C++中实现这一点,我实际上知道这一点,但是由于一些我没有提到的限制,这里不可能实现。这是一个很好的解决方案,如果你有不允许合理解决方案的约束,告诉我们!!这就是说,如果你理解哈夫曼编码背后的数学(或一般的编码理论),就把它应用到你真正的问题领域。