代码之家  ›  专栏  ›  技术社区  ›  Tom Wright

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

  •  2
  • Tom Wright  · 技术社区  · 14 年前

    对于遗传算法的应用,我使用了一大堆二进制字符串。大多数时候,它们的形式是 01001010110 ,以便它们可以交配、变异和“杂交”。

    然而,对于运输和储存来说,这似乎是浪费。把它编码成一个短字符串最简单的方法是什么?

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

    5 回复  |  直到 14 年前
        1
  •  8
  •   Mark Byers    14 年前

    最简单的方法是把每个数字当作一个比特来处理。每组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
  •  2
  •   Abe Miessler    14 年前

    把它转换成10个整数的基数怎么样?

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

    Convert.ToInt32() documentation

        3
  •  1
  •   Scott Chamberlain    14 年前

        4
  •  1
  •   Pedery    14 年前

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

        5
  •  0
  •   Hamish Grubijan    14 年前

    安倍·米斯勒的回答很好,但评论中提到了警告。

    BigInt http://www.codeproject.com/KB/cs/BigInt.aspx (您可能想添加 to/fromBinary() 它的扩展方法。或者将其表示为。。。字节的链接列表。

    这两种方法都有丢弃任何前导零的问题,因此您还需要存储原始长度。