0

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

000000B0789C6330377433D63534D575F3F737B570343767B02929CA2C4B2D4BCD2B29B6B301D376367989B9A976C519F9E50ACE1989452536FA60019B924C20696800017A10CA461F2C6AA30FD58A61427E5E72AA42228A114666E6F88CD047721100D5923799

感谢 Adler 博士在我将值转换为字符串时给出的正确答案。

  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?我会发布我尝试过的两百个不同的代码示例,但这很愚蠢。

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

请帮我睡一觉。

4

1 回答 1

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>

(有一个前导零字节。)

PS看起来有点奇怪,有71F3-15-FOO58A77字母O而不是零。

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

于 2014-10-28T20:33:31.610 回答