ytmfb Geschrieben 9. Januar 2014 Geschrieben 9. Januar 2014 Hallo Leute, ich schlage mich seid einem längerem Zeitraum mit einem Problem rum. Der Ursprung ist SharePoint, allerdings hat dieser in dem Kontext keine weitere Bedeutung. Tatbestand: Ich arbeite mit Visual Studio 2010, die Programmiersprache ist C#. Framework : .NET 4.0 SharePoint Server : 2010 Dieser Code ist komprimiert, meine Aufgabe ist ihn zu dekomprimieren und das in einer kleinen C# Anwendung umzusetzen. 0xA8A930310C000000A9240000789CD55AEB6EDBC8157E1555688B04D8B1867732B10D687DA95DD889613949B18B85319733D62414A992235F7691B7E963F4DFBE58CF48B2448A94E38D94A685015B1C9E9939E79BF39DCBC88EBF43F1277268887F9CDD630DA9BC04D579C346B0D73DC8330399B97A18C3A9ECF6F667EF3BA7 Habe im netz einen Beitrag gefunden der genau diese Codes konvertieren soll. Code gibt's hier : tCompressedString in SharePoint 2010 Content Database | Digitude Leider hab ich dort keine registrieren Funktion gefunden um diese Person zu kontaktieren und der Download Link ist ebenfalls nicht mehr verfügbar. Also habe ich den Code in einer eigenen Anwendung versucht umzusetzen, aber bei mir funktioniert nichts. Gebe ein Byte Array mit diesen oben angegebenen Zahlen ein, der Code sieht so aus ( für die interessierten, können ja einfach mal die Zeilen kopieren und einfügen ) : using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.IO.Compression; namespace SPDecomp { class Program { static void Main(string[] args) { int i = 0; const string code = "0xA8A930310C000000A9240000789CD55AEB6EDBC8157E1555688B04D8B1867732B10D687DA95DD889613949B18B85319733D62414A992235F7691B7E963F4DFBE58CF48B2448A94E38D94A685015B1C9E9939E79BF39DCBC88EBF43F1277268887F9CDD630DA9BC04D579C346B0D73DC8330399B97A18C3A9ECF6F667EF3BA7"; byte[] array = new byte[code.Length]; foreach (char c in code.ToArray()) { array = byte.Parse(c.ToString(), System.Globalization.NumberStyles.HexNumber); i++; } string result = Decompress(array); } static string Decompress(byte[] compressedBytesBuffer) { string uncompressedString = String.Empty; using (MemoryStream compressedMemoryStream = new MemoryStream(compressedBytesBuffer)) { compressedMemoryStream.Position += 12; // Compress Structure Header according to [MS -WSSFO2]. compressedMemoryStream.Position += 2; // Zlib header. using (DeflateStream deflateStream = new DeflateStream(compressedMemoryStream, CompressionMode.Decompress)) { using (MemoryStream uncompressedMemoryStream = new MemoryStream()) { deflateStream.CopyTo(uncompressedMemoryStream); uncompressedMemoryStream.Position = 0; using (StreamReader streamReader = new StreamReader(uncompressedMemoryStream)) { uncompressedString = streamReader.ReadToEnd(); } } } } return uncompressedString; } } } Wenn ich das 0x vorne an dem Code lasse weiß ich nicht wie ich die Zeichen der Methode mit übergeben soll da sich das x nicht in hexadezimal konvertieren lässt. daher folgt die Fehlermeldung "Die Blocklänge entspricht nicht dem Komplement." Wäre seeeehr verbunden wenn mir jemand dabei helfen könnte. Gruß YTMFB Zitieren
Klotzkopp Geschrieben 9. Januar 2014 Geschrieben 9. Januar 2014 2 Hex-Ziffern ergeben 1 Byte. Du machst aus jeder ein eigenes. Zitieren
ytmfb Geschrieben 10. Januar 2014 Autor Geschrieben 10. Januar 2014 und wie wandle ich die voranstehende 0x in hexadezimal ? Zitieren
Klotzkopp Geschrieben 10. Januar 2014 Geschrieben 10. Januar 2014 Gar nicht. Das ist nur eine Kennzeichnung, dass die nachfolgenden Daten als Hex-Ziffern zu interpretieren sind. Lass es weg. Zitieren
ytmfb Geschrieben 10. Januar 2014 Autor Geschrieben 10. Januar 2014 Ok danke, hab die 0x jetzt weggelassen, der rest wird zumindest mal Byteweise aufgeschrieben, allerdings funktioniert das Decompress in diesem Kontext einfach nicht. Kompilieren ist kein Problem aber der Deflatestream lässt sich ja nicht beschreiben. namespace SPConvert { class Program { static void Main(string[] args) { string hexadezimalcode = "0xA8A930310C000000A9240000789CD55AEB6EDBC8157E1555688B04D8B1867732B10D687DA95DD889613949B18B85319733D62414A992235F7691B7E963F4DFBE58CF48B2448A94E38D94A685015B1C9E9939E79BF39DCBC88EBF43F1277268887F9CDD630DA9BC04D579C346B0D73DC8330399B97A18C3A9ECF6F667EF3BA7"; byte[] byteArr = ParseHex(hexadezimalcode); Decompress(byteArr); } public static byte[] ParseHex(string hexadezimalcode) { int offset = hexadezimalcode.StartsWith("0x") ? 2 : 0; if ((hexadezimalcode.Length % 2) != 0) { throw new ArgumentException("Invalid length: " + hexadezimalcode.Length); } byte[] ret = new byte[(hexadezimalcode.Length - offset) / 2]; for (int i = 0; i < ret.Length; i++) { ret = (byte)((Parse4bit(hexadezimalcode[offset]) << 4) | Parse4bit(hexadezimalcode[offset + 1])); offset += 2; } return ret; } static int Parse4bit(char c) { if (c >= '0' && c <= '9') { return c - '0'; } if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } throw new ArgumentException("Invalid hex digit: " + c); } static string Decompress(byte[] compressedBytesBuffer) { string uncompressedString = String.Empty; using (MemoryStream compressedMemoryStream = new MemoryStream(compressedBytesBuffer)) { compressedMemoryStream.Position += 12; // Bedingung für den Algorithmus compressedMemoryStream.Position += 2; using (DeflateStream deflateStream = new DeflateStream(compressedMemoryStream, CompressionMode.Decompress)) { using (MemoryStream uncompressedMemoryStream = new MemoryStream()) { deflateStream.CopyTo(uncompressedMemoryStream); uncompressedMemoryStream.Position = 0; using (StreamReader streamReader = new StreamReader(uncompressedMemoryStream)) { uncompressedString = streamReader.ReadToEnd(); } } } } Console.WriteLine(uncompressedString); Console.ReadKey(); return uncompressedString; } } } Zitieren
Klotzkopp Geschrieben 10. Januar 2014 Geschrieben 10. Januar 2014 Dann sind die Daten vermutlich fehlerhaft oder unvollständig. Zitieren
ytmfb Geschrieben 10. Januar 2014 Autor Geschrieben 10. Januar 2014 oohje. okay dann danke trotzdem! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.