Umwandlung von 8bit zu 7bit

Schnelle objektorientierte, kompilierende Programmiersprache.
chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Mi Feb 26, 2014 11:32 pm

Hallo mfro,

da habe ich schon die 1. Frage
Du nutzt in deinem Code folgendes:
itoh (num >> 4, dst);
"Integer to hex", ok, vielleicht eine dumme Frage, aber das geht doch auch manuell oder?
Weil genau daran störe ich mich bei "fast" allen Projekten an denen ich mich versuche.

Ich steuere ein Display an, hierzu muss ich Integer Zahlen (Werte / Values) nach Strings umwandeln, die Funktionen dazu sind meist, bitte falsch verstehen, für einen Mikrocontroller sehr "Teuer".
Oder ich muss einen Temperaturwert von Float nach Int bzw. String umwandeln, das ist eine Hürde die ich sehr ungerne in Kauf nehme, weil ich sie noch nicht greifen geschweige sauber und "günstig" für einen µC lösen kann.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Mi Feb 26, 2014 11:43 pm

chris_1981_ hat geschrieben:Hallo mfro,

da habe ich schon die 1. Frage
Du nutzt in deinem Code folgendes:
itoh (num >> 4, dst);
"Integer to hex", ok, vielleicht eine dumme Frage, aber das geht doch auch manuell oder?
An der Stelle ruft sich itoh() rekursiv selbst auf. Sehr viel "manueller" als itoh() im Beispiel das macht, geht's nicht. Natürlich kann man das statt rekursiv auch iterativ machen, trotzdem muß man jede einzelne Stelle "von Hand" anfassen.

Die Rekursion dient hier nur dazu, bei der höherwertigsten Hexziffer anzufangen. Viele C Standard-Libs machen das so, daß sie die Hexzahl "rückwärts" aufbauen und am Ende den String mit strrev() "rumdrehen" (das willst Du wahrscheinlich auch nicht).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Fr Feb 28, 2014 10:10 pm

Hallo zusammen,

ich stehe aktuell echt auf dem Schlauch, ich weiß net wieso, aber mir fehlt ein Anhaltspunkt.
ich würde gerne im einzelnen verstehen, wie ich nun mit dieser Situation umgehen muss, soll.

Code: Alles auswählen

    int pos =0;
    char eins[12] = "H";
    char zwei[12] = "";
    char sept[12] = "";

    char *sept_ptr;
    char *eins_ptr;
    char *zwei_ptr;

    sept_ptr = sept;
    eins_ptr = eins;
    zwei_ptr = zwei;

    int e = 0;
    int j;

    for ( j=0;sms_check[j] != '\0';j++)
    {

        for (i = 7; i>=0; i--)
        {
            //putchar( (sms_check[j] & (1 << i)) ? '1' : '0' );
            sms_neu[i] = ( (sms_check[j] & (1 << i)) ? '1' : '0' );
        }
    }

    printf("smsneu: %s \n",sms_neu);

    for ( i=0 ; i<= 7; i++)
    {
        printf ("%c", sms_neu[7-i]);
    }
    printf("\n"); 
Immerhin bekomme ich aus einem H den Binären Wert.
Mir ist klar, ich kann den fertigen Code nehmen, der auf Seite 2 verfügbar ist, aber wie gesagt ich möchte es auch verstehen!

Deshalb meine Fragen:

+ Ist das der richtige Weg aus einem Char Zeichen einen binären Wert zu bekommen?

+ wie kann ich nun aus dem binären Wert ein Septets Wert machen. Gerne auch mit einen einzelnen Wert auch wenn es im Sinn des Projektes, "man braucht" mindestens ja 2 Werte um aus Binär Septets zu machen, das richtig auszuführen ist.

+ wie kann ich im direkten schritt aus einem H den Wert 01001000, aktuell wie oben im Code mache ich ja 2 Schritte. In meinen Büchern lese ich immer nur von 2 Schritten.

+ Entschuldigt die lächerlichen Fragen und dafür das ich es ganz genau verstehen will.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Umwandlung von 8bit zu 7bit

Beitrag von cloidnerux » Fr Feb 28, 2014 11:11 pm

wie kann ich nun aus dem binären Wert ein Septets Wert machen. Gerne auch mit einen einzelnen Wert auch wenn es im Sinn des Projektes, "man braucht" mindestens ja 2 Werte um aus Binär Septets zu machen, das richtig auszuführen ist.
Kurzer Hintergrund zur Funktion von Computern(und auch deinen AVRs):
Ein Computer behandelt alles als Zahlen, auch ein Buchstabe ist nur eine Zahl, die einer Zuordnung gehorcht.
Intern ist eine Zahl immer Binär, für die ALU(Arithmetric Logic Unit) gibt es keine Dezimalen Zahlen, oder Hexadezimal, alles ist binär.
Das wir als "Nutzer" oder Programmierer einen Unterschied zwischen Binär/Dezimal/Hexadezimal machen, liegt nur daran, dass man das so einfacher verstehen kann.
Intern arbeiten alle Modernen Computer mit binären Zahlen die ein vielfaches von 8 stellen haben. Selbst wenn du nur 1 oder 0 speichern willst, musst du eine Variable mit 8-Bit(1 Byte) anlegen, da gibt es keinen unterschied zwischen AVR oder x86.

Früher gab es mal Computer mit unterschiedlichen Bitbreiten, 7, 11, was auch immer, das hat man aber für einfacherer Handhabung sein gelassen. Es ist aber auch möglich UART-Wörter mit 7-Bit zu übertragen, daher wrsl auch diese dämliche Umrechnung mit 7-Bit.

Wenn du nun auf deinem System einen Septet machen willst, kannst du dieses nicht als Septet speichern, es gibt keine Variable mit 7 Bit. Minimum ist 8. Wenn du dir mal die ASCII-Tabelle anschaust wirst du ab 128(was die 7-Bit Grenze darstellt) nur noch Sonderzeichen finden, was den Grund hat, dass man früher Texte immer mit 7-Bit übertragen hat.
Wenn du nun aus einem Zeichen ein Septet erstellen willst verwirfst du ein Bit, was sowieso 0 war um das dann in eine 8-Bit breite Variable zu schreiben => Sinnbefreit.

Die Umwandlung zu den Septets macht nur dann sinn, wenn du einen Text übertragen willst.
wie kann ich im direkten schritt aus einem H den Wert 01001000, aktuell wie oben im Code mache ich ja 2 Schritte. In meinen Büchern lese ich immer nur von 2 Schritten.
Ich weiß nicht, was du als "zwei Schritte" bezeichnest, die einfachste Möglichkeit eine zahl binär darzustellen ist:

Code: Alles auswählen

for(int i = 7; i >= 0; i--)
{
    printf("%d", ('H' & (1 << i))?(1):(0));
}
Was hier gemacht wird, ist jede Stelle mit 1 binär UND zu verknüpfen, ist die Stelle 1 kommt ein Ergebnis > 0 heraus, was in C auch logisch Wahr ergibt, oder 0 was eben logisch falsch ist. Danach wird entweder eine 1 oder eine 0 ausgegeben. Das herunterzählen dient dazu, dass man mit dem MSB zuerst anfängt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Sa Mär 01, 2014 9:50 am

Hallo cloidnerux,

oh, man das klingt ja fast so, als hätte ich einen Anlass gegeben, das ich nicht verstehe wie ein PC / System arbeitet.
Danke für die Informationen!! Ich muss einfach mal "anders" Texte schreiben.
Kurzer Hintergrund zur Funktion von Computern(und auch deinen AVRs):
Ein Computer behandelt alles als Zahlen, auch ein Buchstabe ist nur eine Zahl, die einer Zuordnung gehorcht.
Intern ist eine Zahl immer Binär, für die ALU(Arithmetric Logic Unit) gibt es keine Dezimalen Zahlen, oder Hexadezimal, alles ist binär.
Das wir als "Nutzer" oder Programmierer einen Unterschied zwischen Binär/Dezimal/Hexadezimal machen, liegt nur daran, dass man das so einfacher verstehen kann.
Intern arbeiten alle Modernen Computer mit binären Zahlen die ein vielfaches von 8 stellen haben. Selbst wenn du nur 1 oder 0 speichern willst, musst du eine Variable mit 8-Bit(1 Byte) anlegen, da gibt es keinen unterschied zwischen AVR oder x86.

Früher gab es mal Computer mit unterschiedlichen Bitbreiten, 7, 11, was auch immer, das hat man aber für einfacherer Handhabung sein gelassen. Es ist aber auch möglich UART-Wörter mit 7-Bit zu übertragen, daher wrsl auch diese dämliche Umrechnung mit 7-Bit.
Nochmals Entschuldigung, dass ich dir den Anlass gebe, dass du es hier mit einem "VollDeppen" zu tun hast.

Danke !! das wusste ich nicht :
Die Umwandlung zu den Septets macht nur dann sinn, wenn du einen Text übertragen willst.
Und genau solche kleinen Informationen helfen wir bei meinem Verständnis.

Ich weiß nicht, was du als "zwei Schritte" bezeichnest, die einfachste Möglichkeit eine zahl binär darzustellen ist:
ich meinte damit, und das werde ich Zukunft besser und eindeutiger beschreiben, das ich aktuell immer 2 for schleifen benötige um das H in Binary in richtiger Reihenfolge darzustellen und per printf auszugeben 01001000.

Jetzt verstehe ich halt nicht, da ich es noch nie gemacht habe, wie ich ein Septets erstelle.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Umwandlung von 8bit zu 7bit

Beitrag von cloidnerux » Sa Mär 01, 2014 7:11 pm

Nochmals Entschuldigung, dass ich dir den Anlass gebe, dass du es hier mit einem "VollDeppen" zu tun hast.
Man verlangt von einem Autofahrer nicht, dass er versteht wie sein Motor funktioniert. Fängt man aber damit an, daran rumzuschrauben brauch man die ein oder andere Information.
Ich setze bei keinem Programmieranfänger voraus, dass er versteht wie der Computer funktioniert.
Daher schreibe ich auch mal gerne, warum und weshalb man bestimmte Dinge so macht wie man sie macht, anstatt nur zu sagen: "Ist halt so".
Man ist nicht dumm, weil man etwas nicht weiß, man ist Dumm wenn man es nicht lernen möchte/kann.
Jetzt verstehe ich halt nicht, da ich es noch nie gemacht habe, wie ich ein Septets erstelle.
Ein Septet ist eine 7-Bit breite Zahl, du erhälst ein Septet wenn du das höchstwertigste Bit eines Bytes ignorierst.
ich meinte damit, und das werde ich Zukunft besser und eindeutiger beschreiben, das ich aktuell immer 2 for schleifen benötige um das H in Binary in richtiger Reihenfolge darzustellen und per printf auszugeben 01001000.
Eindeutigkeit ist immer hilfreich :D
Du brauchst keine zwei for-schleifen. Du brauchst sie aber hier, weil der Ansatz mehr erlaubt als du brauchst.
Du legst ein String an, dass ist ein Array das mehrere Zeichen enthält. Die äußerste for-Schleife dient dazu durch den String zu iterieren.
Die innere for-schleife iteriert durch die Bits des einzelnen Zeichens(char).
Wenn du keinen string hast sondern nur ein char, dann brauchst du die äußere Schleife nicht.
Mit etwas C&P könnte man sogar ganz auf die Schleifen verzichten, das wäre dann aber unschöner Code ;)
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Mi Mär 05, 2014 8:57 am

cloidnerux hat geschrieben: Ein Septet ist eine 7-Bit breite Zahl, du erhälst ein Septet wenn du das höchstwertigste Bit eines Bytes ignorierst.
Das stimmt wohl grundsätzlich, in diesem speziellen Fall aber eben grade nicht.

Wie ich bereits mehrfach geschrieben habe (aber das scheint entweder keiner zu lesen oder nicht zu verstehen - vielleicht habe ich mich auch unklar ausgedrückt):

Das SMS PDU-Format füllt die "freien" höherwertigen Bits einer 7-Bit Zahl mit entsprechend vielen niederwertigen Bits des folgenden Zeichens (das anschließend entsprechend rechts verschoben wird, so daß dort ein Bit mehr "frei" wird) auf.

Das erste Byte eines "Septet-Strings" enthält also in "komprimierter Form" ein Bit des zweiten, das zweite zwei des dritten und so weiter, bis nach sieben Bits ein Byte "eingespart" ist. Dann geht's wieder von vorne los.

Genau das setzt mein (ganz am Anfang dieses Freds irgendwo dümpelndes) Progrämmchen um.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Umwandlung von 8bit zu 7bit

Beitrag von cloidnerux » Mi Mär 05, 2014 9:43 am

Wie ich bereits mehrfach geschrieben habe (aber das scheint entweder keiner zu lesen oder nicht zu verstehen - vielleicht habe ich mich auch unklar ausgedrückt):
Ich verstehe deinen Unmut, möchte aber nochmal darauf hinweisen, dass Chris in seiner Arbeitsweise erst versuchen wollte, ein einzelnes Septet zu "bauen" und dann den String. Ich wollte ihn jediglich darauf hinweisen, dass ein einzelnes Septet möglich ist, aber keinen Sinn macht, da man es so gar nicht Speichern kann, er sich also lieber direkt mit der Verkettung beschäftigen sollte.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Mi Mär 05, 2014 9:55 am

cloidnerux hat geschrieben:...erst versuchen wollte, ein einzelnes Septet zu "bauen" ...

Code: Alles auswählen

x &= ~0x80;
cloidnerux hat geschrieben:Ich wollte ihn jediglich darauf hinweisen,...
... und ich dachte schon, Du wolltest ihn auf eine falsche Fährte locken ;)
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Umwandlung von 8bit zu 7bit

Beitrag von cloidnerux » Mi Mär 05, 2014 10:10 am

...erst versuchen wollte, ein einzelnes Septet zu "bauen" ...

Code: Alles auswählen

x &= ~0x80;

Code: Alles auswählen

char x = 'H';
x &= 0x7F; //Ändert sich etwas?
... und ich dachte schon, Du wolltest ihn auf eine falsche Fährte locken ;)
Sowas machen wir hier nicht ;)
Ich wollte aber auch nicht sagen: Geht Nicht! Das ist immer so enttäuschend :D
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten