Распаковать zLib из строки, а не файла в DeflateStream
В течение 2 недель я пытался распаковать эту пользовательскую строку TXXX из файла MP3 ID2,3.
000000B0789C6330377433D63534D575F3F737B570343767B02929CA2C4B2D4BCD2B29B6B301D376367989B9A976C519F9E50ACE1989452536FA60019B924C20696800017A10CA461F2C6AA30FD58A61427E5E72AA42228A114666E6F88CD047721100D5923799
Спасибо доктору Адлеру за правильный ответ, когда я преобразовал значения в строку.
Я пробовал и MS DeflateStream и GZipstream безуспешно.
Каждый пример, который я вижу, использует потоковый файл. Я не использую файл, у меня есть вышеуказанный код zLib в массиве или строковой переменной.
GZipstream дает мне "не магическое число", а Deflatestream - "Длина блока не совпадает с его дополнением".
Я читаю этот пост: http://george.chiramattel.com/blog/2007/09/deflatestream-block-length-does-not-match.html
попытался удалить байты из головы, не повезло. (Я прочитал тразиллионы статей для отправки строки в Deflatestream, но снова "не повезло"!
У меня есть строка выше, так как я могу отправить ее в Deflatestream? Я бы опубликовал двести различных примеров кода, которые я пробовал, но это было бы глупо.
Самое смешное, что я построил свой редактор меток меток webAudio менее чем за две недели, и это последнее, что у меня есть (моя программа должна получить позиции маркеров из программы, в которой человек хуже всего знает звуковой редактор (они встроили их). в MP3 по какой-то (плохой) причине. Следовательно, я написал свой собственный, чтобы изменить маркер звукового сигнала, чтобы я мог сэкономить часы разочарования на работе. Однако в последнее время я мало сплю.
Помоги мне немного поспать, пожалуйста.
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>
(Ведущий нулевой байт.)
PS выглядит немного странно, что есть 71F3-15-FOO58A77
с буквой Os вместо нулей.
PPS Если бы вы могли получить сжатые данные в строку Base64 вместо шестнадцатеричной строки, вы могли бы упаковать больше данных в то же пространство.