用C#解码PHP中的GZIP流
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C#解码PHP中的GZIP流相关的知识,希望对你有一定的参考价值。
我在从外部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
问题是,我不知道如何进一步解码。我已经尝试过gzdecode
,zlib_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);
}
}
我将不胜感激任何解决此问题的指导或提示。
答案
好奇的是,我通常会查找WordPress核心来处理这些事情,因为他们得到了多年来捕获的大部分边缘案例。虽然不是这个。
我没有尝试重建那些C#代码,而是通过相关函数和偏移的多种组合强制执行。
这样就完成了:
var_dump( gzdecode( substr( base64_decode( $data ), 4 ) ) );
// string(128) "{"Code":412,"Value":"RegistrationSet","Route":"CN23/C_Document"}"
以上是关于用C#解码PHP中的GZIP流的主要内容,如果未能解决你的问题,请参考以下文章