Bit Packer
Übersicht

MatthiasBetreff: Bit Packer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay.
Wie der Name schon sagt geht es mir um ein BitPacker. Ich habe zb 30Werte all diese werte sind kleiner als 32 also benötige ich nur 5Bits anstatt 8Bits. Dafür habe ich mir jetzt einen Packer/Entpacker geschrieben. Allerding funtioniert er wirklich nur bei 5Bits richtig. Wenn ich nun 30 Werte habe die alle kleiner wie 64 sind brauche ich ja schon 6Bits, und da fängt mein Problem an. Ich hoffe mir kann jemand helfen. Code: [AUSKLAPPEN] Graphics 800,600,32,2 Dim Zahlen(100) SeedRnd(MilliSecs()) For I=0 To 30 Zahlen(I)=Rand(31) Text 10,I*15,Zahlen(I) Next Bank=Packen(5,29) ;---Bits/MaxWerte For I=0 To 20 Zahlen(I)=0 Next ;Zahlen Löchen Entpacken(Bank,5,29) ;---Bits/MaxWerte For I=0 To 30 Text 40,I*15,Zahlen(I) Next Flip WaitKey() Function Packen(Bit,MaxWerte) Bank=CreateBank(1000) For I=0 To MaxWerte If BOfset>32-Bit Then Rest=(32-BOfset) WN=BBuffer+(Zahlen(I) Shr (Bit-Rest)) PokeInt(Bank,BPos,WN):BPos=BPos+4 BBuffer=Zahlen(I) Shl (32-Bit-BOfset) BOfset=BOfset-32 Else BBuffer=BBuffer+Zahlen(I) Shl (32-Bit-BOfset) End If BOfset=BOfset+Bit Next PokeInt(Bank,BPos,BBuffer) Return Bank End Function Function Entpacken(Bank,Bit,MaxWerte) BBuffer=PeekInt(Bank,0):BPos=4 For I=0 To MaxWerte Wert=(BBuffer Shl BOfset) Shr (32-Bit) If BOfset+Bit>32 Then Rest=(32-Bit-BOfset) BBuffer=PeekInt(Bank,BPos) BPos=BPos+4 Wert=Wert+(BBuffer Shr Rest) BOfset=BOfset-32 End If Zahlen(I)=Wert BOfset=BOfset+Bit Next End Function |
||
![]() |
Xenon |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also wenn du bei dieser Variante bleiben willst, dann würde ich alle Daten nach der größten Zahl durchsuchen und dann auf die entsprechende Bitzahl packen, natürlich musst du die Bitzahl dann allerdings dazuspeichern. Ansonsten wäre es vielleicht interessant für dich, einen anderen Komprimierungsalgorithmus zu verwenden, wie zum Beispiel Huffman: http://de.wikipedia.org/wiki/H...ffman-Code
Dieser ist allerdings schon weit schwieriger zu implementieren, vor allem in Blitz. Mfg, Xenon |
||
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein. Ich will nicht einen Mega-Super-Kompressor schreiben der ein sehr hohes Kompressionsresultat hatt sondernt einfach nur Werte die nur 5Bits benötigen auch nur im 5Bit interwall speichern.
Mehr eigentlich nicht. Mit 5Bits geht doch mein system warum nur nicht mit 4 oder 6 Bit Ich hoffe ihr könnt mir immernoch behilflich sein. Mfg Matthias |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, erst mal Maximalbedarf ermitteln:
Alle Werte durchgehen und durch 2^n teilen, wobei n bei 1 beginnt. immer wenn das Ergebnis > 1 ist wird der Ursprungswert mit um eins erhöhtem n erneut geteilt. n entspricht der Zahl der Bits. Bei nachfolgenden Werten wird n beibehalten, denn es gibt ja mindestens einen wert der dieses n benötigt. Am Ende deiner Werte steht also mit n die Anzahl der Bits für die Wertemenge fest. Nun Schritt 2: Größenermittlung: (Anzahl der Werte * n) / 8 (aufrunden!) ergibt die Größe in Bytes die deine Zielwertbank benötigt. Dann: Werte speichern: Schreib dir eine Funktion die einzelne Bits setzen kann (also setbit(bank,position,bit). Wie das geht: bisheriges Byte an position wird mittels OR an Stelle bit gesetzt. Du gehst nun die Bank byte für byte durch und zählst dabei jeweils bis n, wenn n erreicht wird ist der nächste Wert aus den Ursprungswerten dran. dort kannst du mittels SHR n (hier von n zu 1) ermitteln ob ein bit gesetzt ist und setzt es dann auch in der Bank. Auslesen geht umgekehrt. Ich hoffe das ist einigermassen verständlich. Ach ja, natürlich ist es sinnvoll zu speichern wie groß n ist, ich würde also das erste Byte der Bank für n reservieren - 255 Bit länge sollten mehr als ausreichend sein. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Xenon |
![]() Antworten mit Zitat ![]() |
---|---|---|
darf ich fragen, aus welchem grund du deine daten überhaupt packen willst?
einsehen würde ich es, wenn es eine übung ist, oder es wirklich vergleichsweise riesige mengen an daten sind. ansonsten würde die tatsache, dass dieses packen und entpacken durch die unzähligen bitoperatoren eine sehr negative auswirkung auf die geschwindigkeit hat und entsprechend beim heutigen speicherplatz keine sinnvolle gegenleistung bringt, keinen wirklichen sinn hinter der sache ergeben. Mfg, Xenon |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group