Laden...

Datenmenge vekleinert senden

Erstellt von Mentor49 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.160 Views
M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 15 Jahren
Datenmenge vekleinert senden

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 😉

M
125 Beiträge seit 2008
vor 15 Jahren

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

M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 15 Jahren

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

F
10.010 Beiträge seit 2004
vor 15 Jahren

Es gibt doch im Framework Klassen für Kompression.

DeflateStream
Wenn du dann noch einen Memmorystream benutzt, muss da auch nichts in eine Datei.

M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 15 Jahren

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.

M
125 Beiträge seit 2008
vor 15 Jahren

Könntest du deinen Quellcode bitte posten, mich würde auch interessieren, was an deiner Methode vorher falsch war.

Danke

1.820 Beiträge seit 2005
vor 15 Jahren

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 🙁