Hey,
mein Server sendet etwa jede viertel Sekunde genau 4+228000 Bytes an meinen Client.
Lokal geht das auch einwandfrei, aber wenn das ganze durchs Internet läuft, macht meine Verbindung halt nicht mit...
Desshalb dachte ich mir, dass ich mein dickes Datenpaket "verpacke".
Ich dachte da an den Hoffman-Algorithmus.
Die Theorie, wie dieser Algorithmus funktioniert hab ich komplett verstanden.
Nur mit der Umsetzung komm ich überhaupt nicht klar, da ich noch nie mit einzelnen Bits gearbeitet habe.
Es gibt einige Sourcecodes für diesen Algorithmus, sogar welche in C#, aber habe große Probleme diese in mein Projekt einzubauen.
Ich weiß nähmlich zB auch nicht, wie man den Huffman-Baum noch verschicken soll usw.
Kann mir das eventuell jemand erklären?
Oder hat jemand vllt noch nen anderen Lösungsvorschlag für mich?
Lg Chris 😉
Ich kann dir zwar nicht bei deinem Huffman Algo helfen, ich hätte dafür eine andere Idee:
Du könntest deine Daten serialieseren, auf der Festplatte speichern und das Ganze dann gezippt versenden.
mfg
mrdjoker
Hey Danke erstmal für deine Antwort, allerdings kann ich damit jetzt nicht sehr viel anfangen, könntest du dich noch etwas konkreter ausdrücken?
Außerdem frage ich mich, ob die Performance da mitspielt.
Lg
Es gibt doch im Framework Klassen für Kompression.
DeflateStream
Wenn du dann noch einen Memmorystream benutzt, muss da auch nichts in eine Datei.
Coole Sache, kannte diesen Namespace noch garnicht, geschweige denn diese DeflateStream-Klasse (;
(Und sie beruht, nach dem was ich gelesen hab, sogar auf dem Huffman-Algorithmus)
Wie auch immer, hab mir jetzt folgende Funktion geschrieben:
public byte[] CompressByteArray(byte[] input)
{
MemoryStream ms = new MemoryStream();
DeflateStream compresseStream = new DeflateStream(ms, CompressionMode.Compress, true);
compresseStream.Write(input, 0, input.Length);
compresseStream.Close();
byte[] output = new byte[(int)ms.Length];
ms.Read(output, 0, output.Length);
ms.Close();
return output;
}
Das Input-ByteArray hat ne Länge von 288000.
Das Output-ByteArray ist nacher zwar ca. 70% kleiner, aber es besteht nur aus Nullen.
Wo ist mein Fehler?
Liebe Grüße 😉
Edit: [ QUOTE ] durch [ CSHARP ] ersetzt 😉
Edit:
So, habe den Code nun nochmal umgeschrieben:
public byte[] CompressByteArray(byte[] data)
{
MemoryStream compresseStream = new MemoryStream();
DeflateStream deflateStream = new DeflateStream(compresseStream, CompressionMode.Compress, true);
for (int i = 0; i < data.Length; i++)
{
deflateStream.WriteByte(data[i]);
}
deflateStream.Flush();
deflateStream.Close();
byte[] compresseddata = compresseStream.ToArray();
return compresseddata;
}
Zwar bekomme ich jetzt kein leeres Bytearray mehr zurück, allerdings ist es 72% größer als das, was ich als Input-Daten übergeben habe.
Man man man, erst bekomm ich garnichts zurück...und dann zuviel 😁
Also nochmal die Frage, was mache ich Falsch? 🙁
Lg
Edit: Okay, habs nun hinbekommen 😉 Danke für den Tipp.
Könntest du deinen Quellcode bitte posten, mich würde auch interessieren, was an deiner Methode vorher falsch war.
Danke
Hallo!
Man kann den MemoryStream auch direkt mittels der SharpZipLib packen und spart sich so den Weg über eine zusätzliche Datei.
Nobody is perfect. I'm sad, i'm not nobody 🙁