3

これはおそらく非常に局所的な質問であり、コミュニティの他のメンバーには役に立たないでしょうが、誰かが私を助けてくれることを願っています.

私が知っていること

XML 要素内に、base64 でエンコードされた ZIP が文字列で含まれています。

ファイルは次のようになります。

<Document>
   <Content vesion="1"><!-- BASE64 STRING ---></Content>
</Document>

私がしたいこと

文字列をデコードし、解凍します。

私がこれまでに試したこと(そして失敗したこと)

  • base64 文字列をデコードし、zip 拡張子のファイルに入れます

    public string DecodeFrom64(string encodedData)
    {
    
        byte[] encodedDataAsBytes
    
            = System.Convert.FromBase64String(encodedData);
    
        string returnValue =
    
           System.Text.Encoding.Unicode.GetString(encodedDataAsBytes);
    
        return returnValue;
    
    }
    
  • 関数で文字列を解凍しようとしました:

    public static string DecompressString(string compressedText)
    {
        byte[] gZipBuffer = Convert.FromBase64String(compressedText);
        using (var memoryStream = new MemoryStream())
        {
            int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
            memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
    
            var buffer = new byte[dataLength];
    
            memoryStream.Position = 0;
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                gZipStream.Read(buffer, 0, buffer.Length);
            }
    
            return Encoding.UTF8.GetString(buffer);
        }
    }
    

エラーが発生しました:

GZip ヘッダーのマジック ナンバーが正しくありません。GZip ストリームを渡していることを確認してください...

  • 関数で文字列を解凍しようとしました:

    public static string UnZipStr(string compressedText)
    {
        byte[] input = Convert.FromBase64String(compressedText);
        using (MemoryStream inputStream = new MemoryStream(input))
        {
            using (DeflateStream gzip =
              new DeflateStream(inputStream, CompressionMode.Decompress))
            {
                using (StreamReader reader =
                  new StreamReader(gzip, System.Text.Encoding.UTF8))
                {
                    return reader.ReadToEnd();
                }
            }
        }
    }
    

エラーが発生しました:

ブロックの長さが補数と一致しません...

この XML データを顧客に送信している担当者にメールを送信しましたが、問題は応答が非常に遅い (3 ~ 4 週間) ことです。

だから、誰かが私を正しい方向に向けてくれることを願っています。

質問にファイルを追加することはできないので、誰かが見たい場合は、メールか何かを送信できますか?

4

1 に答える 1

5

ハロルドがコメントですでに指摘しているように、これはすべて間違っています。最後のコメント (Jester) で、zip ファイルが最初に文字列に変換され、次にその文字列が base64 文字列に変換されたことを明確にしました。これは絶対に意味がないので (なぜそうするべきなのか)、そこで何か問題があり、実際にはファイルが base64 文字列に変換されたことを意味していると思います。これは、たとえば電子メールのベスト プラクティスであり、私は最近、XMPP で XML を介してファイルを転送するためにこれを行っています。私の推測では...

byte[] file = System.Convert.FromBase64String(encodedData);
File.WriteAllBytes(directoryToWriteTo+filename+".zip", file);

... 探しているファイルを作成します。ここの byte[] はすでに zip ファイルです。zip ファイルは扱いが面倒なので (何が入っているかは詳しく説明していません)、これらのバイトをファイルに保存し、WinRar などの zip ソフトウェアで開くことをお勧めします。これが機能し、zip ファイルからファイルの内容を取得できる場合は、その内容について別の質問をすることができます。また、SharpZipLib.dll を使用することをお勧めします。これは、これまで妥当な時間内に作業できた唯一のソリューションだからです。

于 2012-10-13T15:29:23.270 に答える