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

时间:2010-10-14 16:49:15

标签: c# string encoding binary

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

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

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

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

5 个答案:

答案 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)

如何将它转换为10的整数当量?

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

Convert.ToInt32() documentation

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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