对于遗传算法应用程序,我使用了大量的二进制字符串。大部分时间他们都采用01001010110
的形式,以便他们可以交配,变异和“交叉”。
然而,对于运输和储存而言,这似乎是浪费。将此编码为较短字符串的最简单方法是什么?
我猜这是非常微不足道的,但我不知道从哪里开始寻找。
更新:我实际上需要以另一个字符串结束:其中一个传输请求将是GET请求。
答案 0 :(得分:8)
最简单的方法是取每个数字并将其视为一点。每组8位可以存储在一个字节中。然后您可以将其作为字节流发送。您还需要存储原始字符串的长度,以便区分“0”和“00”。
以下是编写从字符串到字节数组的转换的一种方法:
byte[] convertToBytes(string s)
{
byte[] result = new byte[(s.Length + 7) / 8];
int i = 0;
int j = 0;
foreach (char c in s)
{
result[i] <<= 1;
if (c == '1')
result[i] |= 1;
j++;
if (j == 8)
{
i++;
j = 0;
}
}
return result;
}
扭转操作非常相似。
如果需要以字符串形式传输数据,可以base 64 encode生成的字节数组。
您可能还想考虑将其保留在内存中。这比将其存储为字符串更有效,其中每个数字都存储为2字节字符。您使用的内存大约是存储数据所需内存的16倍。令人沮丧的是,在这种形式下使用起来稍微困难一些,所以如果你有足够的内存,那么你目前正在做的事情可能就好了。
答案 1 :(得分:2)
答案 2 :(得分:1)
我只是将它们存储为一个字节数组,并使用辅助函数在字节数组版本和字符串版本之间进行转换。
答案 3 :(得分:1)
或实施Run length encoding或Huffman coding。两者都很容易实现。 RLE是迄今为止最简单的,但在大多数情况下压缩比会更差。如果您的数据通常具有相同值的许多连续字符,那么它仍然可以提供实质性的改进。
答案 4 :(得分:0)
Abe Miessler的答案很好,但在评论中提到了警告。
如果64位不足以表示您的字符串,请考虑使用BigInt
类
http://www.codeproject.com/KB/cs/BigInt.aspx(您可能希望向其中添加to/fromBinary()
扩展方法。或者将其表示为...链接的字节列表。
这两种方法都存在丢弃任何前导零的问题,因此您也希望存储原始长度。