我如何编码1s和0s的字符串进行传输?

对于遗传算法应用程序,我使用了大量的二进制字符串。 大部分时间它们都采用01001010110的forms,因此它们可以交配,变异和“交叉”。

然而,对于运输和储存,这似乎是浪费。 将此编码为较短字符串的最简单方法是什么?

我猜这是非常微不足道的,但我不知道从哪里开始寻找。

更新:我实际上需要以另一个字符串结束:其中一个传输请求将是GET请求。

最简单的方法是取每个数字并将其视为一点。 每组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; } 

扭转操作非常相似。

如果需要将数据作为字符串传输,则可以对结果字节数组进行64位编码 。

您可能还想考虑将其保留在内存中。 这比将其存储为字符串更有效,其中每个数字都存储为2字节字符。 您使用的内存大约是存储数据所需内存的16倍。 令人沮丧的是,在这种forms下使用起来稍微困难一些,所以如果你有足够的内存,那么你目前正在做的事情可能就好了。

如何将它转换为10的整数等价?

 int myBin = Convert.ToInt32("01001010110", 2); 

Convert.ToInt32()文档

我只是将它们存储为一个字节数组,并使用辅助函数在字节数组版本和字符串版本之间进行转换。

或者实现行程编码或霍夫曼编码 。 两者都很容易实现。 RLE是迄今为止最简单的,但在大多数情况下压缩比会更差。 如果您的数据通常具有相同值的许多连续字符,那么它仍然可以提供实质性的改进。

Abe Miessler的答案很好,但在评论中提到了警告。

如果64位不足以表示您的字符串,那么考虑使用BigInt类http://www.codeproject.com/KB/cs/BigInt.aspx (您可能希望向其添加to/fromBinary()扩展方法或者将其表示为…链接的字节列表。

这两种方法都存在丢弃任何前导零的问题,因此您也希望存储原始长度。