Laden...

Z64/LZ77-Format decodieren (Für Leute die Spass am tüfteln haben)

Erstellt von unconnected vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.238 Views
unconnected Themenstarter:in
849 Beiträge seit 2006
vor 10 Jahren
Z64/LZ77-Format decodieren (Für Leute die Spass am tüfteln haben)

Hallo zusammen,

ich tüftle seit eingen Tagen an einem Problem das ich bisher nicht knacken konnte.
Und zwar hatte ich mir um mir und anderen die Arbeit zu erleichtern, einen ZPL (Zebra drucker format) Viewer geschrieben. Um die Perfomance an den Druckern an bestimmten Stellen zu verbessern sind wir bei der Bild Übertragung von ASCII auf Z64 umgestiegen. Und somit funktioniert mein Viewer nicht mehr.

Hier mal eine Beispiel Übertragung:

FO123,518GFA,08512,08512,00064,:Z64:
eJzt2EvSnCAQAGAsFyzNCeIVcgNyrOwwNzM3ITcwO1I1vx26m0ZQxvGx+KtSw2IewjeDiE2jUu/y
Lu/yLu/yn5UeDjRqAGBQqgN4rGpagIk+aBi67KdgPubDofmOt1yDdUN/3mMFuEN+xLFa+xb9xF71
mTnoO/T+uu/RP657g37mX1Jm1ztqvfI4/ADXPXG6gKHzJqs85hv241XfsndH/ERnW3q9+HDy9rQP
l3/SPIGu+kFF/1DWn/U9NjM0AV96T1dr7T124rI32CtNB8PJw47/IP+x8Q4vInmvYiQ64S1OnYba
vvSP+Fr64ZbnW+eIf5D/W/cQ70OOZGFYpujlQOY1/ksbh5pb2ZXHE6KaTnqBfg4q+Jb9JA0VXbrC
hxk9UI3hW3PlPbaInk7HDKUPYcqRl9iKDS36P1X/TZU+fJnQNxJbc9+wp5ZtGs7CI0OvJTaSh/Cd
/AMHJnpf8fi3eLoc3M97DEoz+l5iI3qD/nfA7MfnnoPSHIP7uPH0y4e9Sz6sz+e8rXpLfuCWU8V3
4uldLnSP/hd6wJ6tfOjKqPkg+gZ9eHEc2855DGqWfYxt7MeevCGv9vwUGuB0m2WGlX6gPpRew9hF
j0Gtj7Y57lP6ZMLF6cj7zHfof4avOPZ23vVD+DpzLd8A5MNgsh8lOtU9dq4Vb+94V/M49+N9m/ks
fUOCnm4yHqkG417wDXnX1HxKn+zMka3jlCH5yZ71Y81r9H7HwxWfpV/YOfR94UPItjP68KF96RV5
kAC08dPGL+nTMx9i6sb78z6cvPxvPf7UfWAcfMm73H+56b8e8x8x+NNczr0ZT/sxel4//QGPyY9f
eVl/4ZS3c1/6kAUd8ZD5Ifp5148yO/Y9POt/4UOTibyBGP6f5E+ceux7lflm5Yv7f9+n/LHuXdX3
kpXE/LWltTLUxeanvIv5d+4hi5+LNxADX+Ypf++e+lD5Y+uzXTgtz/3K4+gs68+059P+pcGgkrys
X16u8DMf90/oXYtjqWnt5vVT03FZf/C0R/IaUthJ+7fc98X6vevT/rH0ef6w69ua75b8ZdBp/V98
emST7Z/D4OnFQ7vkT8njWK192r9L+oM+5X/07je+yTzPe7Xjp5pPE9PEplVvX3uKUY/Sp/zbpFuS
112IAS/z8vxG0jdNcyHm/z2PbcWP4uX5kaQ/4n3aPwy7Xp5f5T7tfzSP7cbbxcvzs8KbuP9qIdv/
0FQUPyQfg0HhcabJ/s2/8HEySfqmeTBAyf7RVbzJfHx+KekT+SbuUmgjqrYlhd9nxTgZHV+rtkce
me6U235+3WavwOd6yZ4/y7e3fXVWHC7dPf/d5M+JzhcLt737ZD9+pjf3/XDT3+GUWtzz96a/uXf5
VXczel4p/wBHwUff:a844^PQ1,0,1,Y

Laut Doku ist das zwischen den : Ein PNG das erst mit lz77 gepackt ist und dann mit Mime base64 codiert ist. Das decodieren mit base64 klappt soweit, leider beisst sich jeder lz77 algorithmus den ich gefunden habe, die Zähne aus. Nun gut, ich habe fasst aufgegeben. Ich werde mir noch den lz77 ein bischen genauer anschauen und gucken ob es wenigstens valides lz77 ist.

Ich möchte betonen, das das nicht meine Hausaufgaben sind 😃 Und ich nur Leute anspreche die Spaß an bitschubserei haben, und mir vllt ein bischen die Augen öffnen.

Grüße

Jan

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo unconnected,

Even though all LZ77 algorithms work by definition on the same basic principle, they can vary widely in how they encode their compressed data ...

... sagt LZ77 and LZ78 (Abschnitt Implementations)

herbivore

5.658 Beiträge seit 2006
vor 10 Jahren

Hi unconnected,

ist nicht eine PNG-Datei sowieso schon mit LZ77 codiert? Ansonsten einfach mal schauen, an welcher Stelle das Ergebnis mit der Byte-Folge [89,50,4E,47,0D,0A,1A,0A] anfängt, das wäre nämlich die Signatur einer PNG-Datei.

Christian

Weeks of programming can save you hours of planning

unconnected Themenstarter:in
849 Beiträge seit 2006
vor 10 Jahren

Hallo, (Vorsicht Lösung)

ich habe es doch noch lösen können.. Warum passiert das eigentlich immer NACHDEM man ein Post im Forum macht? Also zur Lösung:

Base64 war richtig.
LZ77 ist zwar auch richtig, aber es war derivat ein ZLib Stream. sharpziplib kann damit umgehen.

Dann war darin kein PNG enthalten (Warum sollte man auch dem generierenden Tool glauben, das es wirklich reinsteckt, was es sagt das es reinsteckt..). Es war eine Simple BitMatrix.

Mit folgendem Code kann man das Beispiel lösen:

(64 ist übrigens keine Magik Number sondern Bytes per pixelrow)


var bytes = Convert.FromBase64String(testMimeBase64);           
            

            using (var stream = new InflaterInputStream(new MemoryStream(bytes)))
            {                     
                
                var bytesResult = stream.ToByteArray();

                for (int i = 0; i < bytesResult.Length; i++)
                {
                    bytesResult[i] = (byte) ~bytesResult[i];
                }

                var bit2 = new Bitmap(64*8, (int)(bytesResult.Length/64), PixelFormat.Format1bppIndexed);

                var lockbits = bit2.LockBits(new Rectangle(0, 0, 64*8, (int) (bytesResult.Length/64)), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);

                System.Runtime.InteropServices.Marshal.Copy(bytesResult,0, lockbits.Scan0, bytesResult.Length);
                bit2.UnlockBits(lockbits);
}

Danke trotzdem 😃

C
258 Beiträge seit 2011
vor 10 Jahren

Dann war darin kein PNG enthalten (Warum sollte man auch dem generierenden Tool glauben, das es wirklich reinsteckt, was es sagt das es reinsteckt..). Es war eine Simple BitMatrix.

ist nicht eine PNG-Datei sowieso schon mit LZ77 codiert

du hast dein PNG zuweit entpackt.

unconnected Themenstarter:in
849 Beiträge seit 2006
vor 10 Jahren

Ja, ne.

es ist halt kein PNG. Dann hätte ich den Header gesehen. Aber der Header war halt der eines ZLIB Streams, nicht das eines PNG´s

Das PNG normalerweise auch Deflate benutzt werte ich jetzt mal als Zufall.