【问题标题】:Compress and encode string dropping last two bytes压缩和编码字符串丢弃最后两个字节
【发布时间】:2016-09-30 18:25:05
【问题描述】:

我有一个 VB.NET 应用程序,它生成一个 XML 文档,我需要将它发布到 Web 应用程序。在发布 XML 之前,我需要压缩 XML 并对其进行 base64 编码。下面我有一个代码 sn-p,我在其中获取一个 XML 字符串,使用 gzip 压缩,然后使用 base64 编码。为了确保我所做的事情是正确的,我将解码 base64,然后 gzip 解压缩。解压后,原始 XML 比我测试的 XML 长 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;

【问题讨论】:

    标签: .net vb.net


    【解决方案1】:

    没关系。我没有关闭我的压缩流。应该是这样的:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 2013-07-30
      • 2020-04-12
      相关资源
      最近更新 更多