zLib распаковывает из строки, а не из файла, в DeflateStream

Я пытался в течение 2 недель распаковать эту определяемую пользователем строку TXXX из файла MP3 ID2,3.

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? Я бы опубликовал две сотни различных примеров кода, которые пробовал, но это было бы глупо.

Забавно то, что я создал свой редактор маркеров webAudio менее чем за две недели, и это последнее, что я должен сделать (моя программа должна получать позиции маркеров из программы, которая имеет худший аудиоредактор, известный человеку (они встроили их в MP3 по какой-то (плохой) причине). Поэтому я написал свой собственный, чтобы изменить маркер звуковой метки, чтобы сэкономить часы разочарования на работе. Однако в последнее время я мало сплю.

Помогите мне немного поспать, пожалуйста.


person wally wingnut    schedule 28.10.2014    source источник
comment
(Я переместил VB.NET из вашего заголовка в теги, где он действительно принадлежит.)   -  person Andrew Morton    schedule 28.10.2014


Ответы (1)


Вы можете использовать MemoryStream вместо FileStream, поскольку они оба являются потоками:

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 с буквой О вместо нулей.

П.П.С. Если бы вы могли получить сжатые данные в строку Base64 вместо шестнадцатеричной строки, вы могли бы упаковать больше данных в то же пространство.

person Andrew Morton    schedule 28.10.2014
comment
Ты спас мне жизнь, теперь я могу пойти спать. Скип был тем, чего мне не хватало. У меня было 2 версии (поиск zLib эксперт vb.net) Jonkware сказал использовать пример 1 без начальных нулей. Адлер сказал использовать пример 2. Оба получают тег, но должны просто пропустить. В любом случае кажется, что вам нужно удалить некоторые ведущие байты. - person wally wingnut; 29.10.2014