【问题标题】:Decode GZIP stream in PHP from C#从 C# 在 PHP 中解码 GZIP 流
【发布时间】:2019-07-12 06:19:28
【问题描述】:

我在解码来自外部 API 的 gzip 响应时遇到了一些问题。这个外部 API 返回一个 base64 gziped 字符串,我在用 PHP 解码时遇到问题。

这是来自 API 的响应标头:

< Content-Length: 148
< Content-Type: application/json
< Content-Encoding: gzip
< Expires: -1
< Server: Microsoft-IIS/7.5

现在这是我从 API 获得的正文:

gAAAAB+LCAAAAAAABAA9jM0KQEAURs+zzFrJz8p2rC0oWwlJMVOMlby7L8nu9J177oXB4hmZRAU5CSmRuKVn5fx2Qy2aWTgI7HJB7HE02oN89N54FeFvLJW+ZcSijlJ2kN/k3dvcPFC95lSAAAAAgAAAAB+LCAAAAAAABAA9jM0KQEAURs+zzFrJz8p2rC0oWwlJMVOMlby7L8nu9J177oXB4hmZRAU5CSmRuKVn5fx2Qy2aWTgI7HJB7HE02oN89N54FeFvLJW+ZcSijlJ2kN/k3dvcPFC95lSAAAAAgAAAAB+LCAAAAAAABAA9jM0KQEAURs+zzFrJz8p2rC0oWwlJMVOMlby7L8nu9J177oXB4hmZRAU5CSmRuKVn5fx2Qy2aWTgI7HJB7HE02oN89N54FeFvLJW+ZcSijlJ2kN/k3dvcPFC95lSAAAAA

我怀疑这是base64字符串,所以当我解码它时,我得到了这个:

8000 0000 1f8b 0800 0000 0000 0400 3d8c
cd0a 4040 1446 cfb3 cc5a c9cf ca76 ac2d
285b 0949 3153 8c95 bcbb 2fc9 eef4 9d7b
ee85 c1e2 1999 4405 3909 2991 b8a5 67e5
fc76 432d 9a59 3808 ec72 41ec 7134 da83
7cf4 de78 15e1 6f2c 95be 65c4 a28e 5276
90df e4dd dbdc 3c50 bde6 5480 0000 00

问题是,我不知道如何进一步解码。我尝试了gzdecodezlib_decode 和许多其他功能来解码,但没有成功。

我被困在这里,因为我不知道下一步是什么。

这是API开发者提供的用C#编写的解压方法:

private string Decompress(string aValue)
{
    byte[] gzBuffer = Convert.FromBase64String(aValue);
    using (MemoryStream ms = new MemoryStream())
    {
        int msgLength = BitConverter.ToInt32(gzBuffer, 0);
        ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

        byte[] buffer = new byte[msgLength];

        ms.Position = 0;
        using (System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
        {
            zip.Read(buffer, 0, buffer.Length);
        }

        return System.Text.Encoding.Unicode.GetString(buffer, 0, buffer.Length);
    }
}

如果有任何解决此问题的指导或提示,我将不胜感激。

【问题讨论】:

    标签: c# php asp.net curl gzip


    【解决方案1】:

    好奇的是,我通常会查找 WordPress 核心来处理这些事情,因为它们多年来捕获了大多数边缘情况。不过不是这个。

    我没有尝试重建该 C# 代码,而是简单地通过相关函数和偏移量的多种组合强制执行。

    这样就搞定了:

    var_dump( gzdecode( substr( base64_decode( $data ), 4 ) ) );
    
    // string(128) "{"Code":412,"Value":"RegistrationSet","Route":"CN23/C_Document"}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多