C# 解压缩GZIP流
我正在尝试解压缩一个gzip字符串,它是Web服务响应的一部分。我拥有的字符串是:C# 解压缩GZIP流,c#,gzip,gzipstream,compression,C#,Gzip,Gzipstream,Compression,我正在尝试解压缩一个gzip字符串,它是Web服务响应的一部分。我拥有的字符串是: ”[31,-117,8,0,0,0,0,0,0,0,109,-114,65,11,-62,48,12,-123,-1,75,-50,-61,-42,-127,30,122,21,111,-126,94,60,-119,-108,-72,102,44,-48,-75,-93,-21,100,56,-6,-33,-19,20,20,101,57,37,95,-14,94,-34,4,-63,-5,-72,-73,-4
”[31,-117,8,0,0,0,0,0,0,0,109,-114,65,11,-62,48,12,-123,-1,75,-50,-61,-42,-127,30,122,21,111,-126,94,60,-119,-108,-72,102,44,-48,-75,-93,-21,100,56,-6,-33,-19,20,20,101,57,37,95,-14,94,-34,4,-63,-5,-72,-73,-44,-110,-117,-96,38,-88,26,-74,38,-112,3,117,-7,25,-82,5,24,-116,56,-97,-44,108,-23,28,24,-44,-85,83,34,-41,97,-88,24,-99,23,36,124,-120,94,99,-120,15,-42,-91,-108,91,45,-11,70119,60,-110,21,-20,12,-115,-94111,-80,-93,89,-41,-65,-127,-82,76,41,51,-19,52,90,-5,69,-85,76,-96,-128,64,22,35,-33,-23,-124,-79,-55,-1,-2,-10,-87,0,55,-76,10,-57122,-9,73,42,-45,98,-44,5,77101,-3,58,-91,39,38,51,-1510,“>
我正在尝试使用以下方法解压缩该字符串:
public static string UnZip(string value)
{
// Removing brackets from string
value = value.TrimStart('[');
value = value.TrimEnd(']');
//Transform string into byte[]
string[] strArray = value.Split(',');
byte[] byteArray = new byte[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
if (strArray[i][0] != '-')
byteArray[i] = Convert.ToByte(strArray[i]);
else
{
int val = Convert.ToInt16(strArray[i]);
byteArray[i] = (byte)(val + 256);
}
}
//Prepare 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);
//Reset variable to collect uncompressed result
byteArray = new byte[byteArray.Length];
//Decompress
int rByte = sr.Read(byteArray, 0, byteArray.Length);
//Transform byte[] unzip data to string
System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte);
//Read the number of bytes GZipStream red and do not a for each bytes in
//resultByteArray;
for (int i = 0; i < rByte; i++)
{
sB.Append((char)byteArray[i]);
}
sr.Close();
ms.Close();
sr.Dispose();
ms.Dispose();
return sB.ToString();
}
知道问题出在哪里以及如何解决吗?试试看
public static string UnZip(string value)
{
// Removing brackets from string
value = value.TrimStart('[');
value = value.TrimEnd(']');
//Transform string into byte[]
string[] strArray = value.Split(',');
byte[] byteArray = new byte[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
byteArray[i] = unchecked((byte)Convert.ToSByte(strArray[i]));
}
//Prepare for decompress
using (System.IO.MemoryStream output = new System.IO.MemoryStream())
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray))
using (System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
{
sr.CopyTo(output);
}
string str = Encoding.UTF8.GetString(output.GetBuffer(), 0, (int)output.Length);
return str;
}
}
公共静态字符串解压缩(字符串值)
{
//从字符串中删除括号
value=value.TrimStart('[');
value=value.TrimEnd(']');
//将字符串转换为字节[]
字符串[]strArray=value.Split(',');
byte[]byteArray=新字节[strArray.Length];
for(int i=0;i
MemoryBuffer()
不会“复制”byteArray
,而是由它直接支持,因此不能重用byteArray
我要补充一点,我觉得有趣的是,他们将277个字符的json“压缩”为620个字符的字符串化字节数组
作为旁注,此方法的内存占用超出了上限…要解压缩的620个字符串(实际上是277字节的数组)会导致创建总大小为4887字节的字符串/数组(包括620个初始字符串)(免责声明:GC可以在方法执行期间回收部分内存)。对于277字节的字节数组,这是可以的……但是对于较大的数组,内存占用将变得相当大。试试看
public static string UnZip(string value)
{
// Removing brackets from string
value = value.TrimStart('[');
value = value.TrimEnd(']');
//Transform string into byte[]
string[] strArray = value.Split(',');
byte[] byteArray = new byte[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
byteArray[i] = unchecked((byte)Convert.ToSByte(strArray[i]));
}
//Prepare for decompress
using (System.IO.MemoryStream output = new System.IO.MemoryStream())
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray))
using (System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
{
sr.CopyTo(output);
}
string str = Encoding.UTF8.GetString(output.GetBuffer(), 0, (int)output.Length);
return str;
}
}
公共静态字符串解压缩(字符串值)
{
//从字符串中删除括号
value=value.TrimStart('[');
value=value.TrimEnd(']');
//将字符串转换为字节[]
字符串[]strArray=value.Split(',');
byte[]byteArray=新字节[strArray.Length];
for(int i=0;i
MemoryBuffer()
不会“复制”byteArray
,而是由它直接支持,因此不能重用byteArray
我要补充一点,我觉得有趣的是,他们将277个字符的json“压缩”为620个字符的字符串化字节数组
作为旁注,此方法的内存占用超出了上限…要解压缩的620个字符串(实际上是277字节的数组)会导致创建总大小为4887字节的字符串/数组(包括620个初始字符串)(免责声明:GC可以在方法执行期间回收部分内存)。对于277字节的字节数组,这是可以的……但是对于较大的字节数组,内存占用将变得相当大。根据Xanatos在C#中的回答,稍微修改以返回一个简单的字节数组。这将使用gzip压缩字节数组并返回膨胀的gunzipped数组
public static byte[] Decompress(byte[] compressed_data)
{
var outputStream = new MemoryStream();
using (var compressedStream = new MemoryStream(compressed_data))
using (System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(
compressedStream, System.IO.Compression.CompressionMode.Decompress))
{
sr.CopyTo(outputStream);
outputStream.Position = 0;
return outputStream.ToArray();
}
}
根据Xanatos在C#中的回答,稍微修改为返回一个简单的字节数组。这将获取一个gzip压缩字节数组并返回膨胀的gunzipped数组
public static byte[] Decompress(byte[] compressed_data)
{
var outputStream = new MemoryStream();
using (var compressedStream = new MemoryStream(compressed_data))
using (System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(
compressedStream, System.IO.Compression.CompressionMode.Decompress))
{
sr.CopyTo(outputStream);
outputStream.Position = 0;
return outputStream.ToArray();
}
}
未压缩的结果可能比压缩数据大。new byte[byteArray.Length]
仅在压缩为1:1时有效。未压缩的结果可能比压缩数据大。new byte[byteArray.Length]
仅在压缩为1:1时有效。