C# C-如何解压缩ISO-8859-1字符串
我有一个C程序,它接收iso-8859-1字符集中接收的压缩比特流。 我需要得到被压缩的字符串。 它应该相当于以下python代码:C# C-如何解压缩ISO-8859-1字符串,c#,compression,iso-8859-1,C#,Compression,Iso 8859 1,我有一个C程序,它接收iso-8859-1字符集中接收的压缩比特流。 我需要得到被压缩的字符串。 它应该相当于以下python代码: zlib.decompress(bytes(bytearray(json_string, 'iso8859')), 15+32). 我尝试了以下代码进行解压缩: Encoding iso_8859_1 = Encoding.GetEncoding("iso-8859-1"); byte[] isoBytes = iso_8859_
zlib.decompress(bytes(bytearray(json_string, 'iso8859')), 15+32).
我尝试了以下代码进行解压缩:
Encoding iso_8859_1 = Encoding.GetEncoding("iso-8859-1");
byte[] isoBytes = iso_8859_1.GetBytes(inputString);
// then do GZip extract
MemoryStream objMemStream = new MemoryStream();
objMemStream.Write(isoBytes, 0, isoBytes.Length);
objMemStream.Seek(0, SeekOrigin.Begin);
GZipStream objDecompress = new GZipStream(objMemStream, CompressionMode.Decompress);
但是,objDecompress.Read失败了,所以我做错了什么
*****2003年3月31日编辑
进行压缩的Java代码是:
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(JsonStr.getBytes());
gzip.close();
return out.toString("ISO-8859-1");
我需要一个C代码来获取JsonStr。
希望获得一些帮助。有内置类,但我无法设法逆转这一点,可能是因为有默认常量,如。在这期DotNet运行时杂志中也有关于这个主题的讨论
有一个NuGet包,您可以使用它来解压缩数据。您可以在这里阅读一个简单的压缩/解压缩实现
Python压缩
进口zlib
导入binascii
json_字符串=“{aaaaaaaaaa:1111111,bbbbbbbbbbbbb:cccccc}”
compressed_data=zlib.compressbytesbytearrayjson_字符串'iso8859',2
解压_数据=zlib.decompressed_数据,15+32
打印“压缩的十六进制数据:%s”%binascii.Hexlify压缩的\u数据
打印“解压缩数据:%s”%Decompressed\u数据
将输出:
压缩十六进制数据:b'785eab564a8403252b054338d051504a4200a09452321250aa0500e4681153'
解压数据:b'{aaaaaaaa:1111111,bbbbbbbbbbb:cccccc}'
解压
静态环[]args{
var extCompressedHex=785eab564a8403252b054338d051504a4200a09452321250aa0500e4681153;
var extCompressed=hextStringToByteArrayExtCompressedHex;
字节[]extDecompressedData;
解压缩数据ExtCompressed,OutExtDecompressedData;
字符串extDecompressedJson=Encoding.GetEncodingISO-8859-1.GetStringextDecompressedData;
Console.WriteLineHex ext compressed:{0},byteArrayToHextCompressed.ToArray;
Console.WriteLineRaw ext decompressed:{0},extDecompressedJson;
}
无效解压缩数据字节[]inData,输出字节[]outData
{
使用MemoryStream outMemoryStream=新的MemoryStream
使用ZOutputStream outZStream=new ZOutputStreamoutMemoryStream
在MemoryStream中使用流=新的MemoryStreaminData
{
CopyStreaminMemoryStream,outZStream;
尾流;
outData=outMemoryStream.ToArray;
}
}
//辅助函数___________________________________________________
字符串ByteArrayToHexbyte[]字节
{
StringBuilder sw=新的StringBuilder;
foreach字节b(以字节为单位)
{
sw.AppendFormat{0:x2},b;
}
返回sw.ToString;
}
无效CopyStreamSystem.IO.Stream输入,System.IO.Stream输出
{
字节[]缓冲区=新字节[2000];
内伦;
而len=input.Readbuffer,0,2000>0
{
output.Writebuffer,0,len;
}
输出。刷新;
}
字节[]HexStringToByteArraystring十六进制
{
返回Enumerable.Range0,十六进制长度
。其中x=>x%2==0
.Selectx=>Convert.tobytex.Substringx,2,16
.托雷;
}
将输出:
六角外部压缩:785EAB564A8403252B0544338D051504A4200A09452321250AA0500E4681153
已解压缩原始ext:{aaaaaaaaaa:1111111,bbbbbbbbbbbbb:cccccccc}
您可以在这里检查它是否正常工作。有内置类,但我无法设法逆转这一点,可能是因为有默认常量,如。在这期DotNet运行时杂志中也有关于这个主题的讨论
有一个NuGet包,您可以使用它来解压缩数据。您可以在这里阅读一个简单的压缩/解压缩实现
Python压缩
进口zlib
导入binascii
json_字符串=“{aaaaaaaaaa:1111111,bbbbbbbbbbbbb:cccccc}”
compressed_data=zlib.compressbytesbytearrayjson_字符串'iso8859',2
解压_数据=zlib.decompressed_数据,15+32
打印“压缩的十六进制数据:%s”%binascii.Hexlify压缩的\u数据
打印“解压缩数据:%s”%Decompressed\u数据
将输出:
压缩十六进制数据:b'785eab564a8403252b054338d051504a4200a09452321250aa0500e4681153'
解压数据:b'{aaaaaaaa:1111111,bbbbbbbbbbb:cccccc}'
解压
静态环[]args{
var extCompressedHex=785eab564a8403252b054338d051504a4200a09452321250aa0500e4681153;
var extCompressed=hextStringToByteArrayExtCompressedHex;
字节[]extDecompressedData;
解压缩数据ExtCompressed,OutExtDecompressedData;
字符串extDecompressedJson=Encoding.GetEncodingISO-8859-1.GetStringextDecompressedData;
Console.WriteLineHex ext compressed:{0},byteArrayToHextCompressed.ToArray;
Console.WriteLineRaw ext decompressed:{0},extDecompressedJson;
}
无效解压缩数据字节[]inData,输出字节[]outData
{
使用MemoryStream outMemoryStream=新的MemoryStream
使用ZOutputStream outZStream=new ZOutputStreamoutMemoryStream
在MemoryStream中使用流=新的MemoryStreaminData
{
CopyStreaminMemoryStream,outZStream;
尾流;
outData=outMemoryStream.ToArray;
}
}
//辅助函数______________________
_____________________________
字符串ByteArrayToHexbyte[]字节
{
StringBuilder sw=新的StringBuilder;
foreach字节b(以字节为单位)
{
sw.AppendFormat{0:x2},b;
}
返回sw.ToString;
}
无效CopyStreamSystem.IO.Stream输入,System.IO.Stream输出
{
字节[]缓冲区=新字节[2000];
内伦;
而len=input.Readbuffer,0,2000>0
{
output.Writebuffer,0,len;
}
输出。刷新;
}
字节[]HexStringToByteArraystring十六进制
{
返回Enumerable.Range0,十六进制长度
。其中x=>x%2==0
.Selectx=>Convert.tobytex.Substringx,2,16
.托雷;
}
将输出:
六角外部压缩:785EAB564A8403252B0544338D051504A4200A09452321250AA0500E4681153
已解压缩原始ext:{aaaaaaaaaa:1111111,bbbbbbbbbbbbb:cccccccc}
你可以在这里检查它是否工作。我认为它应该更像这样
Encoding iso_8859_1 = Encoding.GetEncoding("iso-8859-1");
string inputData = "";
string outputData = "";
// then do GZip extract
using (MemoryStream uncompressedData = new MemoryStream())
using (GZipStream decompressor = new GZipStream(uncompressedData, CompressionMode.Decompress))
{
byte[] inData = Encoding.ASCII.GetBytes(inputData);
decompressor.Write(inData, 0, inData.Length);
outputData = iso_8859_1.GetString(uncompressedData.ToArray());
}
我认为应该是这样
Encoding iso_8859_1 = Encoding.GetEncoding("iso-8859-1");
string inputData = "";
string outputData = "";
// then do GZip extract
using (MemoryStream uncompressedData = new MemoryStream())
using (GZipStream decompressor = new GZipStream(uncompressedData, CompressionMode.Decompress))
{
byte[] inData = Encoding.ASCII.GetBytes(inputData);
decompressor.Write(inData, 0, inData.Length);
outputData = iso_8859_1.GetString(uncompressedData.ToArray());
}
您确定不想先解压缩,然后将这些字节解释为ISO-5589-1吗?@madreflection看起来像python代码确实需要字符串并将其转换为数组,然后才进行解压缩。我同意这没什么意义。。。但这就是代码告诉我们的。AZur-请在Python示例中使用一个名为json_string的示例值发布,因为它显然不是json。你也查过15+32代表什么吗?实际上是47+40到+47=32+8到15:使用值的低4位作为窗口大小对数,并自动接受zlib或gzip格式。根据文档,这个值决定了窗口大小,从而提高了压缩效率。在应用编码之前,您不想先解压缩GZIP吗?GZIP只包含ASCII字符,不需要编码。您确定不想先解压缩,然后将这些字节解释为ISO-5589-1吗?@madreflection看起来像python代码确实需要字符串并将其转换为数组,然后再解压缩。我同意这没什么意义。。。但这就是代码告诉我们的。AZur-请在Python示例中使用一个名为json_string的示例值发布,因为它显然不是json。你也查过15+32代表什么吗?实际上是47+40到+47=32+8到15:使用值的低4位作为窗口大小对数,并自动接受zlib或gzip格式。根据文档,这个值决定了窗口大小,从而提高了压缩效率。在应用编码之前,您不想先解压缩GZIP吗?GZIP只包含ASCII字符,不需要编码。