【问题标题】:zLib decompress from string not file to DeflateStreamzLib 从字符串而非文件解压缩到 DeflateStream
【发布时间】:2014-10-28 19:14:36
【问题描述】:

我已经尝试了 2 周来从 MP3 ID2,3 文件中解压缩这个用户定义的 TXXX 字符串。

000000B0789C6330377433D63534D575F3F737B570343767B02929CA2C4B2D4BCD2B29B6B301D376367989B9A976C519F9E50ACE1989452536FA60019B924C20696800017A10CA461F2C6AA30FD58A61427E5E72AA42228A114666E6F88CD047721100D5923799

感谢 Adler 博士在我将值转换为字符串时提供了 correct answer

  1. 我已尝试过 MS DeflateStream 和 GZipstream,但均未成功。

  2. 我看到的每个示例都使用流文件。我没有使用文件,我在数组或字符串变量中都有上述 zLib 代码。

  3. GZipstream 给我“没有幻数”,Deflatestream 给我“块长度与其补码不匹配”。

  4. 我读了这篇文章: http://george.chiramattel.com/blog/2007/09/deflatestream-block-length-does-not-match.html

  5. 尝试从头部删除字节,但没有成功。 (我阅读了无数关于向 Deflatestream 发送字符串的文章,但又一次“不走运”!

我有上面的字符串,那么如何将它发送到 Deflatestream?我会发布我尝试过的 200 个不同的代码示例,但这很愚蠢。

有趣的是,我在不到两周的时间内构建了我的 webAudio 提示标记编辑器,这是我做的最后一件事(我的程序必须从一个拥有人类已知的最差音频编辑器的程序中获取标记位置(他们出于某种(不好的)原因将它们嵌入到 MP3 中)。因此,我编写了自己的代码来更改音频提示标记,这样我就可以节省数小时的工作挫败感。但是,我最近睡眠不足。

请帮我睡一觉。

【问题讨论】:

  • (我把 VB.NET 从你的标题移到了标签,这才是它真正的归属。)

标签: vb.net zlib deflatestream


【解决方案1】:

您可以使用 MemoryStream 而不是 FileStream,因为它们都是 Stream:

Imports System.IO
Imports System.IO.Compression
Imports System.Text

Module Module1

    Function HexStringToBytes(s As String) As Byte()
        If (s.Length And 1) = 1 Then
            Throw New ArgumentException("String is an odd number of characters in length - it must be even.")
        End If
        Dim bb As New List(Of Byte)
        For i = 0 To s.Length - 1 Step 2
            bb.Add(Convert.ToByte(s.Substring(i, 2), 16))
        Next
        Return bb.ToArray()

    End Function

    Sub Main()
        Dim s = "000000B0789C6330377433D63534D575F3F737B570343767B02929CA2C4B2D4BCD2B29B6B301D376367989B9A976C519F9E50ACE1989452536FA60019B924C20696800017A10CA461F2C6AA30FD58A61427E5E72AA42228A114666E6F88CD047721100D5923799"

        Dim result As String = ""

        ' trim off the leading zero bytes and skip the three bytes 0xB0 0x78 0x9C
        Dim buffer = HexStringToBytes(s).SkipWhile(Function(b) b = 0).Skip(3).ToArray()

        Using ms As New MemoryStream(buffer)
            Using decompressedMemoryStream As New MemoryStream
                Using decompressionStream As New DeflateStream(ms, CompressionMode.Decompress)
                    decompressionStream.CopyTo(decompressedMemoryStream)
                    result = Encoding.Default.GetString((decompressedMemoryStream.ToArray()))
                End Using
            End Using
        End Using

        Console.WriteLine(result)

        Console.ReadLine()

    End Sub

End Module

输出:

  71F3-15-FOO58A77 <trivevents><event><name>show Chart</name><time>10000000.000000</time></event><event><name>show once a</name><time>26700000.000000</time></event></trivevents>

(有一个前导零字节。)

附: 71F3-15-FOO58A77 的字母是 Os 而不是零,这看起来有点奇怪。

附言如果您可以将压缩数据转换为 Base64 字符串而不是十六进制字符串,您可以将更多数据打包到同一空间中。

【讨论】:

  • 你救了我的命,我现在可以睡觉了。跳过是我所缺少的。我有 2 个版本(搜索 zLib 专家 vb.net) Jonkware 说要使用示例 1 而没有前导零。 Adler 说要使用示例 2。两者都获得了标签,但必须跳过。无论哪种方式,您似乎都必须删除一些前导字节。
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多