Seite 1 von 9

Umwandlung von 8bit zu 7bit

Verfasst: Mi Feb 12, 2014 9:38 pm
von chris_1981_
Hallo zusammen,

wo kann ich nachlesen, wie ich aus 8bit ascii Zeichen nach 7bit umwandle.
Mir geht es nicht darum, alles vor geschrieben und gelöst zu bekommen, ich will es nur verstehen.

nehmen wir den text "hallo"

H = dezimal = 72 = hex = 48
a = dezimal = 61 = hex = 97
l = dezimal = 6C = hex = 108
l = dezimal = 6C = hex = 108
o = dezimal = 6F = hex = 111

wie stelle ich den Text nun um?
Muss ich erst jeden Charakter nach binär umstellen und den 1. Binärwert von Links wegschneiden?
Geht das auch direkt?
Doch jetzt fehlt mir mal wieder das Know How um daraus 7bit zu machen.

geht das vielleicht so?

Code: Alles auswählen

val &= 0x7F;
Entschuldigt mal wieder für solch eine dumme Frage.

Re: Umwandlung von 8bit zu 7bit

Verfasst: Mi Feb 12, 2014 9:52 pm
von cloidnerux
wo kann ich nachlesen, wie ich aus 8bit ascii Zeichen nach 7bit umwandle.
Du kannst es nicht, du arbeitest auf einer 8/16/32/64-Bit Plattform, alle Variablen sind mindestens 8 Bit breit.

Was du haben willst, ist ein Binär-Array, wo jedes Element 7 Bit breit ist.
Was du also machen musst, ist die 7 Bit deines wertes an die richtigen Stellen in dein Array zu schieben.
Was du also machen könntest, wäre ein long long int(hoffentlich 8 byte) nehmen, und die Bits richtig zuwesien:

Code: Alles auswählen

long long int i = 0;
i |= (wert7bit & 0x7F) << shiftValue;
Hoffe ich konnte dir weiter helfen.

Re: Umwandlung von 8bit zu 7bit

Verfasst: Mi Feb 12, 2014 10:10 pm
von chris_1981_
OK, danke für deine Info.
noch habe ich es nicht verstanden, aber ich denke das wird.
Warum ich das haben will, ich will aus einem PDU Message-Array (SMS) nach Text und zurück wandeln...
Ich versuche mein Glück mal weiter.

Re: Umwandlung von 8bit zu 7bit

Verfasst: Mi Feb 12, 2014 10:44 pm
von mfro
Hier geht's doch um die SMS-Codierung, richtig?

Da werden die 7-Bit Zeichen nicht einfach in 8 Bit "zusammengeschoben" (das wär' ja zu einfach).

Die Erfinder waren offensichtlich der Ansicht, daß es hier um Telefonie geht und deshalb bloß nix verwendet werden darf, was es schon gibt und schon gar nix, was etwa einfach zu verstehen wäre ;).

Die 7 Bit des ersten Zeichens werden "rechtsbündig" in das erste Byte geschrieben (so, daß das höchstwertige Bit unbenutzt bleibt). Dann werden die niederwertigsten Bits des nächsten Zeichen (für das erste Zeichen im String also das Bit 0) von links an die freien Stellen des vorherigen Zeichens eingeschrieben. Damit hat das zweite Zeichen nur noch 6 Bits (wird wieder rechtsbündig verschoben) und zwei höchstwertige Bits werden "frei". Da kommen dann die zwei niederwertigsten Bits des nächsten Zeichens hinein, das wieder nach rechts verschoben wird und so weiter.

Wenn Du also mit dem String "Hallo" hast:

Code: Alles auswählen

         H       a        l        l        o
Hex: 0x48, 0x61, 0x6c, 0x6c, 0x6f
Binär: 01001000, 01100001, 01101100, 01101100, 01101111
Das höherwertigste (jeweils am weitesten links stehende) Bit ist in allen Zeichen unbenutzt.
Das "Zusammenschieben" geht jetzt folgendermaßen:
01001000 bleibt 01001000
Die niederwertigste 1 des nächsten Bytes wird an die höchstwertige Stelle des vorigen geschrieben:
11001000
Vom nächsten Byte ist jetzt noch 0110000 übrig (Bit 0 ist ja schon untergebracht), "links" sind jetzt zwei Stellen frei. Die werden wieder mit den niederwertigsten Bits des nächsten Bytes aufgefüllt:
00110000
Und so weiter. Einigermaßen klar?

Jetzt mußt Du nur noch das Programm drumrum basteln ;)

Hilfestellung: man setzt ein Bit mit einer bestimmten Wertigkeit in einem Byte mit "oder":

Code: Alles auswählen

wert |= (1 << Pos)
Man löscht ein Bit mit einer bestimmten Wertigkeit, indem man es mit seinem Komplement "verundet":

Code: Alles auswählen

wert &= ~(1 << Pos)
P.S.: man bricht sich also bei SMSen die Ohren, nur um den String "Hallo" zu komprimieren. Komprimiert ist bei der Stringlänge noch gar nichts (die Kompression stellt sich erst beim 8. Byte ein, wenn die "Reste" vollständig in die freigewordenen Stellen passen). Eigentlich ein witziges, aber auch ineffektives Format. Wie man auf so was kommt, ist mir schleierhaft.

Re: Umwandlung von 8bit zu 7bit

Verfasst: Mi Feb 12, 2014 11:13 pm
von chris_1981_
wow, abgefahren dein Beispiel und es ließt sich so einfach,

ich lese mir grade auch noch ein anderes Beispiel durch.
http://www.mdetroy.de/reload.html?/hp_f ... 45/pdu.htm

Dein Beispiel verstehe ich zwar noch nicht zu 100%, wird aber schon deutlicher als beim Link...

Bin grade einmal angefangen, mir selber den weg aufzuschreiben...
H = 72 = 01001000 = 11001000 usw.
damit ich es auch endlich mal greifen kann.

Wisst ihr ich stelle gerade fest, <kopfschüttel> ich mache ja kleinere Dinge mit µC mit denen man ja auch teilweise Bits verschiebt / shiftet und ich frage euch solche Sachen </kopschüttel>
Danke...

Re: Umwandlung von 8bit zu 7bit

Verfasst: Mi Feb 12, 2014 11:35 pm
von cloidnerux
Wisst ihr ich stelle gerade fest, <kopfschüttel> ich mache ja kleinere Dinge mit µC mit denen man ja auch teilweise Bits verschiebt / shiftet und ich frage euch solche Sachen </kopschüttel>
Danke...
Es soll ja vorkommen, dass man den Wald vor lauter Bäumen nicht sieht :D

Re: Umwandlung von 8bit zu 7bit

Verfasst: Do Feb 13, 2014 5:53 am
von mfro
chris_1981_ hat geschrieben: Bin grade einmal angefangen, mir selber den weg aufzuschreiben...
H = 72 = 01001000 = 11001000 usw.
damit ich es auch endlich mal greifen kann.
Die höchstwertige (linke) 1 ist nur dann richtig, wenn das nächste Zeichen an Stelle 0 (ganz rechts) in der 8-Bit Darstellung eine 1 stehen hat. Sonst ist ein H einfach nur 1001000.

Du mußt immer zwei Zeichen auf einmal betrachten.

Re: Umwandlung von 8bit zu 7bit

Verfasst: Do Feb 13, 2014 1:27 pm
von chris_1981_
Das mit den 2 Zeichen gleichzeitig habe ich nicht bedacht ich will immer nur mit einem Zeichen arbeiten

Re: Umwandlung von 8bit zu 7bit

Verfasst: Do Feb 13, 2014 1:31 pm
von cloidnerux
Das mit den 2 Zeichen gleichzeitig habe ich nicht bedacht ich will immer nur mit einem Zeichen arbeiten
Das funktioniert nicht, deine Variablen sind immer ein vielfaches von 8-Bit, egal ob auf dem AVR, ARM, x86. Wenn du aber einen Bit-Stream bauen willst, wo jedes Zeichen nur 7-Bit hat, dann musst du diese 7 Bit irgendwie in deine 8-Bit Variablen bringen, das bedeutet mehr als ein Zeichen betrachten.

Re: Umwandlung von 8bit zu 7bit

Verfasst: Do Feb 13, 2014 1:49 pm
von Xin
Schreib Dir ein Klasse, die folgendes leistet:

Du hast ein short (16 Bit) und merk Dir wieviele Bit Du davon nutzt:

Code: Alles auswählen

class BitStream
{
  unsigned short stream;
  unsigned short usage;
};
Dort pushst Du die 7 Bit rein, die Dein Zeichen hat:

Code: Alles auswählen

  usage += 7;
  stream <<= 7;
  stream |= newdata & 0x7F;
Anschließend fragst Du ab, ob Du schon 8 Bit voll hast:

Code: Alles auswählen

  if( usage >= 8 )
  {
    usage -= 8;
    unsigned char data = (unsigned char) stream >> usage;  // 8 Bit rauslesen
    stream &= ~ (0xFF << usage); // ausgelesenes Byte auf 0 setzen
    sendData( data );         // 8 Bit-Datum irgendwo hinschicken/zwischenlagern
  }
Das machst Du jetzt für jedes Zeichen und erhältst einen 7 Bit-Stream.
Hinweis: Das habe ich jetzt mal so hingeschrieben, das muss deswegen nicht direkt funktionieren, aber die Idee dahinter ist klar, oder?