0

このユーザー定義の TXXX 文字列を MP3 ID2,3 ファイルから解凍するために 2 週間試みてきました。

000000B0789C6330377433D63534D575F3F737B570343767B02929CA2C4B2D4BCD2B29B6B301D376367989B9A976C519F9E50ACE1989452536FA60019B924C20696800017A10CA461F2C6AA30FD58A61427E5E72AA42228A114666E6F88CD047721100D5923799

値を文字列に変換したときの正解については、アドラー博士に感謝します。

  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 キュー マーカー エディターを 2 週間もかからずに作成しましたが、これが最後の作業です (私のプログラムは、人に知られている最悪のオーディオ エディターを持つプログラムからマーカー位置を取得する必要があります (彼らはそれらを埋め込んでいます)。なんらかの (悪い) 理由で MP3 に入っています). したがって、私はオーディオ キュー マーカーを変更して、仕事でのフラストレーションを何時間も節約できるように独自に作成しました. しかし、私は最近あまり眠っていません.

少し眠らせてください。

4

1 に答える 1

1

どちらもストリームであるため、FileStream の代わりに MemoryStream を使用できます。

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-FOO58A77PSゼロの代わりに文字 Oがあるのは少し奇妙に見えます。

PPS 圧縮されたデータを 16 進文字列ではなく Base64 文字列に変換できれば、より多くのデータを同じスペースに詰め込むことができます。

于 2014-10-28T20:33:31.610 に答える