zLib从字符串而不是文件解压缩到DeflateStream

时间:2014-10-28 19:14:36

标签: vb.net zlib deflatestream

我已经尝试用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,但再次'没有运气'!

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

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

    请帮我睡个好觉。

1 个答案:

答案 0 :(得分:1)

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

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>

(有一个前导零字节。)

P.S。看起来有点奇怪的是71F3-15-FOO58A77有字母Os而不是零。

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