Bit Packer

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Matthias

Betreff: Bit Packer

BeitragMo, Feb 25, 2008 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 25, 2008 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 25, 2008 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragMo, Feb 25, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 25, 2008 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group