2016-09-30 6 views
2

Webアプリケーションに投稿する必要があるXML文書を生成するVB.NETアプリケーションがあります。私がXMLを投稿する前に、XMLを圧縮してbase64でエンコードする必要があります。以下では、XML文字列を取得し、gzipを使用して圧縮し、次にbase64でエンコードするコードスニペットがあります。私がやっていることが正しいことを確認するために、私はbase64をデコードしてから、gzipの解凍を行っています。解凍後、元のXMLは、テストしたXMLよりも2バイト長くなります。私は最後の2バイトをどこかに落としています。彼らはどこに行きましたか?最後の2バイトを圧縮してエンコードする文字列

Dim xml As String = ds.ToXMLString() 

    ' compress and encode 
    Dim ceb() As Byte = System.Text.Encoding.UTF8.GetBytes(xml) 
    Dim cems As New System.IO.MemoryStream() 
    Dim cegz As New System.IO.Compression.GZipStream(cems, IO.Compression.CompressionMode.Compress) 
    cegz.Write(ceb, 0, ceb.Length) 
    Dim cees As String = System.Convert.ToBase64String(cems.ToArray()) 

    ' i want to make sure everything is working, 
    ' decode and decompress and make sure it matches 
    Dim ddb() As Byte = System.Convert.FromBase64String(cees) 
    Dim ddms As New System.IO.MemoryStream(ddb) 
    Dim ddgz As New System.IO.Compression.GZipStream(ddms, IO.Compression.CompressionMode.Decompress) 
    Dim ddms2 As New System.IO.MemoryStream() 
    ddgz.CopyTo(ddms2) 

    Dim xmlRestored As String = System.Text.Encoding.UTF8.GetString(ddms2.ToArray()) 

    Assert.AreEqual(xml.Substring(0, xmlRestored.Length), xmlRestored) ' <-- SUCCESS 
    Assert.AreEqual(xml.Length, xmlRestored.Length) ' <-- FAILS; xml.length=147802; xmlRestored.length=147800; 

答えて

0

気にしないでください。私は私の圧縮ストリームを閉じていませんでした。このようにする必要があります:

Dim xml As String = ds.ToXMLString() 

' compress and encode 
Dim ceb() As Byte = System.Text.Encoding.UTF8.GetBytes(xml) 
Dim cems As New System.IO.MemoryStream() 
Dim cegz As New System.IO.Compression.GZipStream(cems, IO.Compression.CompressionMode.Compress) 
cegz.Write(ceb, 0, ceb.Length) 

' i was missing the closing of the gzip stream 
cegz.Close() 

Dim cees As String = System.Convert.ToBase64String(cems.ToArray()) 

' i want to make sure everything is working, 
' decode and decompress and make sure it matches 
Dim ddb() As Byte = System.Convert.FromBase64String(cees) 
Dim ddms As New System.IO.MemoryStream(ddb) 
Dim ddgz As New System.IO.Compression.GZipStream(ddms, IO.Compression.CompressionMode.Decompress) 
Dim ddms2 As New System.IO.MemoryStream() 
ddgz.CopyTo(ddms2) 

Dim xmlRestored As String = System.Text.Encoding.UTF8.GetString(ddms2.ToArray()) 

Assert.AreEqual(xml, xmlRestored) ' <-- SUCCESS 
Assert.AreEqual(xml.Length, xmlRestored.Length) ' <-- SUCCESS 
関連する問題