字符串压缩/解压缩要通过网络发送的数据

时间:2014-07-24 07:27:38

标签: c# string compression

我在C#中寻找一个字符串压缩方法,在将其写入网络套接字之前,我可以在数据字符串上运行它?我对任何类型的压缩都相当新,因此我在这里寻找一些建议/指导。

为什么?

这是在一个应用程序中运行的,它在一个服务器上运行,该服务器不断地将消息发送到我们的另一个服务器,但是托管该应用程序的服务器需要使用的数据,这是相当昂贵的。移动主机不是一种选择。

所以我需要一个算法/库,它可以(cpu wise)压缩我们发送的sting消息。我愿意牺牲一些CPU使用来减少网络上的数据。

我不确定会发生什么类型的压缩比,我认为这取决于您发送的字符串消息的类型及其长度。

我正在寻找相当短的字符串,平均从100个字符到256个字符。奇怪的是长约900个字符。

示例字符串:

žŸKO9404ŸMR4ŸTT8DB3CŸTM08:50:26.253ŸDIVFSV09

这是一个较长的例子:

žŸAC15019ŸCI1602ŸSC7ŸZN001ŸPN01ŸFT7F55ŸCLSGKNetworkŸTP1ŸMR0ŸTT9733EŸIDGPAM01;GPAM02;GPAM03;GPAM05;GPAM04;GPAM06;GPAM07;GPAM08;GPAM09;GPAM10;GPAM02;GPAM03;GPAM04;GPAM05;GPAM06;GPAM07;GPAM08;GPAM09;GPAM10;GPAM01ŸTM09:01:08.858;09:01:09.066;09:01:09.043;09:01:09.044;09:01:09.066;09:01:09.066;09:01:09.065;09:01:09.068;09:01:09.067;09:01:09.067;09:01:50.395;09:01:50.386;09:01:50.386;09:01:50.386;09:01:50.396;09:01:50.384;09:01:50.385;09:01:50.386;09:01:50.386;09:01:50.384ŸTG584C;584C;584C;584C;584C;584C;584C;584C;584C;584C;589F;589F;589F;589F;589F;589F;589F;589F;589F;589F

所以我正在寻找一种解决方案,我可以在发送服务器上压缩,然后在接收服务器上解压缩。

什么是我最好的解决方案?

4 个答案:

答案 0 :(得分:2)

压缩的Gzip示例:

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress);

    //Compress
    sw.Write ...
    sw.Close();

Gzip Sample for Decompress:

    System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray);
    System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
        System.IO.Compression.CompressionMode.Decompress);

    //Decompress
    int rByte = sr.Read ...
    sr.Close();

答案 1 :(得分:1)

由于你的字符串长度平均为900,为什么你需要压缩它,因为普通网络的最低​​MTU大约是1474(以太网和ipV4)?知道你的一半字节是UTF-8 1字节编码。

即:如果您通过网络发送100-250 bytes,则与发送1474 bytes的费用相同。

答案 2 :(得分:0)

您可以在同一名称空间中查看System.IO.Compression.GZipStream类或其“兄弟”DeflateStream。

答案 3 :(得分:0)

鉴于您控制解决方案的两端。也许你应该考虑使用像Protobuf之类的东西构建的二进制协议,而不是使用Text并尝试压缩它。

如果您可以在一个块中发送更少的数据,但是通过网络将更多这些块作为一个操作发送,则可以降低传输成本。

ABC - 第一次发送(延迟3秒) DEF - 第二次发送

发送ABCDEF 1次发送,但延迟6秒。