【问题标题】:Deflate string C#放气字符串 C#
【发布时间】:2020-07-06 02:47:21
【问题描述】:

我尝试对从 websocket 连接获得的字符串进行放气,但每次尝试运行此代码时都会出现错误。我还尝试使用 ascii 编码直接从字符串中获取字节,但它也不起作用。

public static byte[] Decompress(string input)
{

    byte[] data = Convert.FromBase64String(input)
    byte[] decompressedArray = null;

    using (MemoryStream decompressedStream = new MemoryStream())
    {
        using (MemoryStream compressStream = new MemoryStream(data))
        {
            using (DeflateStream deflateStream = new DeflateStream(compressStream, CompressionMode.Decompress))
            {
                deflateStream.CopyTo(decompressedStream);
            }
        }
        decompressedArray = decompressedStream.ToArray();
    }
    return decompressedArray;
}

System.IO.InvalidDataException:“块长度与其补码不匹配。”

我尝试了该代码的一些不同变体,但没有任何效果,但我知道这是可能的,因为我可以使用此网站 http://www.txtwizard.net/compression 和 deflate 选项对其进行放气。

我想放气的一个示例字符串:

eAGdVMmO2kAU / BXUc3WYXr1wy3LIKYqUjHKIo6jtboODsVG72YT491SbIWMYkcNgiX4uv6pXr7efxHXdatYvtDPs8Qf7wkh0JF3xx5a + J7MjUVnKK8tsQbOEJqyQ2pQ0kSJ8s6118wOZcSlpROp2q411n7Xb2t5bAzyO5SkiymjDdFLaSgpZJCZOK6NYTINE7ztnx1pMifg0kAwrK16mqTSWSl4VcWGVGkiLOniTjKJqa / F + ky314Xu9ghBXIpFZSoPEXK / sCyqylAWTVRfKrTqDbLLrXGMIcrd1v9ENkGNOfE5mOXE5iXKyRywSBAcEFOMOI + MIFghijD1GkKq6aRDlpGh0uRy4vXfd0g7gDpYRIb1b67L2g9qUq9Mpb / 9VRF0keDQ0cD5 + fZo89Xp + 5gUjUuB7oDKMl7pdG9LpNL3Sas7uGT6JZEpVIIYXNg3hniOU6TQb8PAC / H9WNs7Z1t / YgfDAB50P0bMl3dTzFmBOGlvB3JWxmyb5VIrJ40Se7QZX8Vh07OleS2FSXjckxtSbou + 31mFe77cjIfmmZlLMZbBz3Ygce7nXhryzMsDH9JtWPmzKpfWTbzhG450yWhr1tqXJsix93QnExmZGvcgwZ5ct9rLHBjRsMIXNBiqJyKa37vlqUYZJQ1NDVZEmlRA6sfgL5 / N3jfsDl8 + djLNKiwMeDrGvnG6XkC60mQ + 3iT + sw2XAI1J2TecYsh60KbQtkDVAPEA8VpXJLhDuNPLAdHgArbXTKzJ7F4uIVE29JjPvNvaE36 + / hpSDkQ == P>

【问题讨论】:

    标签: c# compression deflate screeps


    【解决方案1】:

    字符串 (JSON) 可能来自 GZipStream
    您可以使用这个其他流来解压缩数据内容:

    ► 您需要 .Net Framework 4.7.2+ 才能正确解压数据。

    请注意,压缩格式有点关闭。压缩数据签名 78 : 01 可能表明这是一个 ZLib 压缩字符串,因此基于 ZLib(来自 .NET Framework 4.5)的 .Net DeflateStream 应该解压缩数据。
    7-Zip 和 WinZip 都无法打开数据(保存为二进制文件的流)。

    using System.IO;
    using System.IO.Compression;
    using System.Text;
    
    public static byte[] Decompress(string input)
    {
        byte[] data = Convert.FromBase64String(input)
    
        using (var decompressedStream = new MemoryStream())
        using (var compressStream = new MemoryStream(data))
        using (var gzip = new GZipStream(compressStream, CompressionMode.Decompress)) {
            gzip.CopyTo(decompressedStream);
            return decompressedStream.ToArray();
        }
    }
    

    JSON 是 UTF8 编码的(它也适用于 ASCII 字符串):

    string json = Encoding.UTF8.GetString(Decompress(base64String));
    

    导致(.Net Fidddle):

    [
       "room:shard1/W1N1",
       {
          "objects":{
             "5982fe1eb097071b4adc0743":{
                "energy":2440,
                "invaderHarvested":2664
             },
             "5dad1a7cef434b7d68fd5160":{
                "store":{
                   "energy":1536
                }
             },
             "5dd1cf2c884de042fb6be550":{
                "hits":4100,
                "nextDecayTime":25374980
             }
          },
          "gameTime":25373981,
          "info":{
             "mode":"world"
          },
          "visual":"{\"t\":\"r\",\"x\":37,\"y\":0,\"w\":12,\"h\":6,\"s\":{\"fill\":\"black\",\"stroke\":\"white\",\"opacity\":0.25}}\n{\"t\":\"t\",\"text\":\"CPU Usage\",\"x\":43,\"y\":1,\"s\":{\"font\":0.8}}\n{\"t\":\"l\",\"x1\":37.05,\"y1\":1.5,\"x2\":48.95,\"y2\":1.5}\n{\"t\":\"t\",\"text\":\"Current Usage\",\"x\":37.5,\"y\":2.5,\"s\":{\"align\":\"left\"}}\n{\"t\":\"t\",\"text\":\"2.43 / 4\",\"x\":46.5,\"y\":2.5}\n{\"t\":\"l\",\"x1\":37.05,\"y1\":3,\"x2\":48.95,\"y2\":3}\n{\"t\":\"t\",\"text\":\"Average Usage\",\"x\":37.5,\"y\":4,\"s\":{\"align\":\"left\"}}\n{\"t\":\"t\",\"text\":\"2.82\",\"x\":46.5,\"y\":4}\n{\"t\":\"l\",\"x1\":37.05,\"y1\":4.5,\"x2\":48.95,\"y2\":4.5}\n{\"t\":\"t\",\"text\":\"Bucket Storage\",\"x\":37.5,\"y\":5.5,\"s\":{\"align\":\"left\"}}\n{\"t\":\"t\",\"text\":9998,\"x\":46.5,\"y\":5.5}\n{\"t\":\"l\",\"x1\":44,\"y1\":1.55,\"x2\":44,\"y2\":5.95}\n",
          "users":{
             "595d14d08d05b87f33a7e33a":{
                "_id":"595d14d08d05b87f33a7e33a",
                "username":"wtfrank",
                "badge":{
                   "type":22,
                   "color1":"#adbaeb",
                   "color2":"#265fd9",
                   "color3":"#1a1a1a",
                   "param":-63,
                   "flip":true
                }
             }
          }
       }
    ]
    

    【讨论】:

    • 如果我在您的示例中使用 GzipStream,我仍然会收到错误 System.IO.InvalidDataException: “GZip 标头中的幻数不正确。确保您正在传递 GZip 流。”
    • 原来它只适用于 .NET Framework 4.7.2 而我使用的是 4.6.1,我对其进行了更改,现在它可以工作了,谢谢
    • 你是对的。你至少需要4.7.24.7.1 在这里也失败了。我会把它添加到笔记中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2020-07-20
    相关资源
    最近更新 更多