2

ヘッダー ファイルを含まない Gzip 文字列を圧縮するメソッドを作成し、解凍する前とまったく同じように圧縮するにはどうすればよいでしょうか。元の圧縮は C# で行われ、次の方法を使用して Ruby で膨張しています。

編集: 基本的に、一致する deflate メソッドをこのインフレートに使用したいと思います:

def inflate(string)
    zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
end

解凍前の文字列は次のとおりです。

"5\x891\n\xC30\x10\x04{\xBDb\xEB\xE0F&\x81\xA4\xCA3\xDC\xA81\xD2\x1A]\xA1\x13\xB1.\x100\xFEF\xDE\e\x19\x9Cb\x99Yf\xCA\xB3A\x1A,\x13\xB1\x96R\x15I\x96\x85+5\x12\xA2=\xF4:\xAFb\xB9\xD0$\xA2\xF1\xF5>\xDA\xD3\xB9\x9A\xA8f\xFC\xD8\xE6\xFD\x00\x7F\xEB{\f!Uk{\xCF,\x91\xDC\x1C\x10J\xC4\xF7z\xCA\xE8p9\xF8\xFF\xF7\x93\xDEw\xD9\x7F"

そして、inflate を使用して解凍すると、次のようになります。

    "What is the common difference in this arithmetic sequence?\n\n\\indenttext{11, 15, 19,\\dots}\n\n\\emcee{\n  \\mc \x964\n  \\mc 2\n *\\mc 4\n  \\mc 8\n  \\mc 11\n  }"

複数の deflate メソッドを作成しようとしましたが、元に戻すことができるものはありません。ご協力いただきありがとうございます!

編集:元の圧縮は、次を使用して.NET 2.0で行われました

byte[] compressedStringBytes = CompressGzipString(String);

CompressGzipString は次のことを行います。

MemoryStream compressed = new MemoryStream();
DeflaterOutputStream zosCompressed = new DeflaterOutputStream(compressed, new Deflater(Deflater.BEST_COMPRESSION, true));
zosCompressed.Write(data, 0, data.Length);

正確なオリジナルに戻すことができない場合、最も標準化された圧縮は何でしょうか。つまり、一般的であり、オリジナルと同じ方法で解凍できますか?

4

2 に答える 2

2

実際には、C# でどのように圧縮されたかによって異なります。.NET 4.5 より前System.IO.DeflateStream/GZipStreamは、C# のクラスは、zlib とは大きく異なる Microsoft の DEFLATE 実装を使用していました (つまり、zlib で簡単にエミュレートできない可能性があります)。ほとんどすべてのケースでさらに悪化したため、.NET 4.5 では、Ruby で実行できることと一致するzlibに置き換えられました。

文字列を生成した C# のバージョンがわかれば、元のバイトに戻せるかどうかを判断できます。.NET 4.5 で生成された場合は、同じ設定で標準の deflate を実行して同じバイトを取得できるはずです。

于 2012-12-27T17:50:45.890 に答える