LZ77 Problem

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Quadsoft.

    Hey Leute,
    Ich will eine Funktion schreiben die Komprimierte LZ77 Bilder aus GBA Spielen extrahieren kann.
    Als vorlage habe ich folgendes Tutorial: LZ77-Tut

    Als denkhilfe folgendes Bild:




    Hier mein Code:

    VB.NET-Quellcode

    1. Public Shared Function DecimalToBinary(ByVal DecimalNum As String) As String
    2. Return DirectCast(Convert.ToString((Convert.ToUInt32(DecimalNum)), 2).PadLeft(8, "0"c), Object)
    3. End Function
    4. Public Shared Function BinaryToDecimal(ByVal Binary As String) As String
    5. Return DirectCast(Convert.ToUInt32(DirectCast(Binary, String), 2), Object)
    6. End Function
    7. Function SwapBytes(ByVal input As String) As String
    8. Dim temp As String = ""
    9. For i = 0 To input.Length - 1 Step 2
    10. temp = input(i) & input(i + 1) & temp
    11. Next
    12. Return (temp)
    13. End Function
    14. Function SwapBytes(ByVal input() As Byte) As String
    15. Dim temp As String = ""
    16. For Each B As Byte In input
    17. temp = insertZero(B) & temp
    18. Next
    19. Return (temp)
    20. End Function
    21. Function insertZero(ByVal input As String, Optional ByVal MinLength As Integer = 2) As String
    22. While input.Length < MinLength
    23. input = "0" & input
    24. End While
    25. Return input
    26. End Function
    27. Public Function unLZ(ByVal BinReader As IO.BinaryReader, ByVal Offset As Integer) As List(Of Byte)
    28. BinReader.BaseStream.Position = Offset
    29. If Not BinReader.ReadByte = &H10 Then Return Nothing
    30. Dim LZ_Länge As String = Val("&H" & SwapBytes(BinReader.ReadBytes(3)))
    31. Dim DekodierByte As String = DecimalToBinary(BinReader.ReadByte)
    32. Dim Puffer As New List(Of Byte)
    33. While Puffer.Count < LZ_Länge
    34. Dim X = 0
    35. While X < 7
    36. If DekodierByte(X) = "0" Then
    37. Puffer.Add(BinReader.ReadByte)
    38. ElseIf DekodierByte(X) = "1" Then
    39. On Error Resume Next
    40. Dim Byte1 As String = insertZero(Hex(BinReader.ReadByte)) & insertZero(Hex(BinReader.ReadByte))
    41. Dim Rückgriff_Länge As String = ("&H" & Byte1(1) & Byte1(2) & Byte1(3)) + 1
    42. Dim Übernahme_Länge As String = Val(Byte1(0)) + 3
    43. Puffer.AddRange(Puffer.GetRange(Puffer.Count - Rückgriff_Länge, Übernahme_Länge))
    44. End If
    45. X += 1
    46. End While
    47. End While
    48. MsgBox(Puffer.Count)
    49. Return Puffer
    50. End Function


    aber irgendwie bekomme ich nen Falschen output(Falsches Bild)
    könnt ihr vllt. den Fehler entdecken? Sitze nun schon seit über 3 tagen an dem Problem X( :D

    Danke schonmal im vorraus :)

    Gruß,
    Julian

    VB.NET-Quellcode

    1. DekodierByte(X)

    um zu bestimmen ob das nächste byte dekodiert ist oder nicht....

    weil DekodierByte ist ja das byte in binär form, also z.B. 00000010 das heißt die nächsten 6 bytes sind unkodiert, dann kommt ein kodierters und dann wieder ein unkodiertes

    Gelöschter Benutzer schrieb:

    um zu bestimmen ob das nächste byte dekodiert ist oder nicht....

    sei b ein Byte/Short/Integer/Long mit Wert x. Dann ermittelt man den Wert des Bits an Position i mit:

    VB.NET-Quellcode

    1. Gesetzt As Boolean = (b AND 1<<i) > 0


    Ich kann jetzt nicht erkennen, wieso irgendjemand was mit String, Char etc machen muss. Der einzige Grund wäre, dass derjenige nix von binärer Logik versteht, aber dann ist die Abhilfe nicht String, sondern LESEN!

    Denn so was ...

    VB.NET-Quellcode

    1. Public Shared Function DecimalToBinary(ByVal DecimalNum As String) As String
    2. Return DirectCast(Convert.ToString((Convert.ToUInt32(DecimalNum)), 2).PadLeft(8, "0"c), Object)
    3. End Function

    ... ist einfach nur grausam!

    EDIT: wozu braucht man "Swap"? Ist der GBA big endian?
    Dann gilt:
    BigEndian16 = (LittleEndian16 << 8) OR (LittleEndian >> 8)
    @ErfinderDesRades: Nein, das schaubild ist von einem User aus einem anderen Forum. Ja es ist Korrekt da er es von einem User hat der sehr viel Erfahrung in dem Bereich hat! Leider ist dieser wegen seines Studiums zurzeit nicht ereichbar :(