4 Zahlen binär speichern?



  • Hi!

    Wie kann ich 4 Zahlen (jeweils von 0...127) so binär abspeichern (als eine Zahl? incl. Reihenfolge), dass ich insgesamt nur 2 Bytes Speicher brauche und die Information wieder später auslesen kann? Ich komme auf keine Lösung bisher. Danke schon mal für jede Art von Anregung.

    gruss
    kjesse



  • Gar nicht.

    Rechne selbst: bis 127 sind's 7 Bits. Du hast 4 Werte, sind also mindestens 28 Bits. In 2 Byte sind aber (für gewöhnlich, ich nehme einfach mal an, ein Byte hat bei dir 8 Bit) 16 Bit.

    Da 16<28, bedeutet dies mindestens einen Datenverlust.



  • Hier etwas ähnliches:
    http://www.c-plusplus.net/forum/p672409

    hier noch was:
    http://de.wikipedia.org/wiki/Byte
    => musst eine PDP-10 nehmen - da kannst du dir die Länge eines Bytes wählen, bis 36bit

    MfG f.-th.



  • Danke für die Anregungen. Ich möchte einen Kompressor für Asciizeichen bauen und ein Zeichen hat einen Wert von max. 128. Ich versuche ein Wort von 4 Buchstaben/Zahlen als 2Byte-Wert abzuspeichern.



  • Du kannst in zwei Byte nur 65535 verschiedene Werte abspeichern, möchtest aber 128 * 128 * 128 * 128 Werte reinpacken ... das geht nicht, wie Glühbirne schon auf andere Weise erläutert hat.



  • kjesse schrieb:

    Danke für die Anregungen. Ich möchte einen Kompressor für Asciizeichen bauen und ein Zeichen hat einen Wert von max. 128. Ich versuche ein Wort von 4 Buchstaben/Zahlen als 2Byte-Wert abzuspeichern.

    1. ASCII (und der ganze Mist mit Copepages) ist schon kodiert. Was meinst du, warum ich immer wieder lesen darf, dass Leute Schwierigkeiten haben, von MB in Unicode zu setzen? Das liegt daran, dass 8 Bit lange nicht genug Platz für alle Zeichen bieten.

    2. Ein Wort ist (zumindest meines Wissens) ein 2-Byte-Wert.



  • @TE
    Guck dir mal
    http://de.wikipedia.org/wiki/LZ77
    an. Dein Vorhaben ist halt (wie schon gesagt) so erstmal unmöglich, aber vielleicht interessiert dich der Link ja.



  • Ich habe versucht über ein schnelles Hashverfahren einen String (4 Byte) in einen 2 Byte hash umzuwandel, um ihn binär (uint16_t) abzuspeichern. Das Problem beim Hashverfahren ist, ich muss wegen des Wertebereichs (bis 65536) modulo 65521 (Primzahl) durchführen und bekomme jede Menge Homonyme bzw. Kollisionen. Gibt es für so ein Vorhaben ein "perfect hashing" oder durch das Teilen habe ich etwa immer Doppelte? Daher hatte ich überlegt, ob man jedes byte des Strings durch einen Sprung in ein 4 dim Array darstellen kann. Aber das geht auch nicht. Hashverfahren ohne Doppelte wäre ideal.



  • Hashing ist primär keine Komprimierung, und somit sind deine gemachten Erfahrungen leicht einsehbar.



  • Wenn du nur Großbuchstaben, Ziffern, Leerzeichen, Zeilenende, Stringende und Punkt zulässt brauchst du 40 Zeichen.
    Mit 40*40*40 = 64000 bekommst du dann 3 Zeichen in 16 Bit unter.
    Das ist dann aber verlustbehaftete Komprimierung.



  • Wenn alle Werte zwischen 0 und 127 für alle Bytes des Strings möglich sein sollen, wirst du im worst case immer mindestens 28 Bit zur Speicherung brauchen. Es mag möglich sein, die üblichsten Fälle kürzer darzustellen, wenn man bereit ist, längere Darstellungen für unüblichere Fälle in Kauf zu nehmen, aber dann muss man natürlich die Längeninformation irgendwo unterbringen. Bei Eingabedaten dieser Länge sieht das auf den ersten Blick nicht besonders sinnvoll aus.



  • Thread schließen und kjesse dumm sterben lassen!


Anmelden zum Antworten