Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-如何解压缩ISO-8859-1字符串_C#_Compression_Iso 8859 1 - Fatal编程技术网

C# C-如何解压缩ISO-8859-1字符串

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_

我有一个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_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字符,不需要编码。