int in char * umwandeln



  • CStoll schrieb:

    Ganz einfach: ein int wird intern als Binärwert mit (typischerweise) 4 Byte Länge gespeichert - und wenn du den als char-Array interpretierst, wird jedes diesr Bytes als Einzelzeichen gelesen. Das heißt, du mußt die int-DAten auf Binärebene wieder zurückverwandeln:

    lnp_integrity_read(buffer);
    memcpy((char*)&v,buffer,sizeof(int));
    

    Ich glaube, dass das mit memcopy funktionieren kann. Ich habe als Test erst einmal eine normale Zeichenkette benutzt. Diese gebe ich auf dem Display des Robos aus (mit cputs(<<TEXT>>);). Das müsste genau so funktionieren wie lnp_integry_write(), ist aber einfacher zu überprüfen.

    char v[3] = "ha2";
    char buffer[3];
    
    memcpy(buffer,v,3);	
    
    cputs(buffer);
    

    Das funktioniert. Auf dem Display steht ha2.
    Jetzt versuche ich es mit einem Integer.
    Ich dachte da an sowas:

    int i = 33;
    char buffer[30];
    
    memcpy(buffer,&i,sizeof(int));
    
    cputs(buffer);
    

    Geht aber nicht. Was mache ich falsch?



  • Du liest nur die Hälfte des Threads - in einem int steht eine binäre Repräsentation des Zahlenwertes (und der sieht, als char* interpretiert, katastrophal aus). Für die Darstellung kommst du nicht darum, itoa() und Konsorten zu verwenden (wenn nicht vorhanden, mußt du es nachprogrammieren).

    (PS: der String "ha2" benötigt übrigens 4 Byte (eins für das Stringende-Zeichen '\0'), da ist dein Test-Array etwas zu kurz gewählt)



  • Simon2 schrieb:

    P.S.: Damit, einen int einfach so über Maschinengrenzen (mit unterschiedlicher Architektur) hinwegzusenden, wäre ich ebenfalls sehr vorsichtig ...

    für sowas muss man eigentlich ein protokoll benutzen, in dem genau festgelegt ist, wie ein 'int' für die übertragung auszusehen hat. erst recht, wenn man auch zwischendurch mal andere datentypen, wie strings oder doubles verschicken will...
    :xmas2:

    edit: was ganz einfaches ist z.b. das hier: http://en.wikipedia.org/wiki/Type-length-value



  • ten schrieb:

    ...
    für sowas muss man eigentlich ein protokoll benutzen...

    Genau das wollte ich damit ausdrücken !

    Allerdings kann man als Protokoll oftmals durchaus die ASCII-String-Darstellung nehmen.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Allerdings kann man als Protokoll oftmals durchaus die ASCII-String-Darstellung nehmen.

    kann man. es gibt ja genügend erfolgreiche beispiele wie z.b. HTTP. nachteilig dabei ist nur, dass textbasierte protokolle empfangsseitig schwieriger auseinanderzufrickeln sind als irgendwelche binärformate....

    btw: man könnte ja auch XML nehmen, aber das machen nur total durchgeknallte 😉

    :xmas2:



  • CStoll schrieb:

    Für die Darstellung kommst du nicht darum, itoa() und Konsorten zu verwenden (wenn nicht vorhanden, mußt du es nachprogrammieren).

    Würde ich gerne machen.
    Wie kann ich das denn nachprogrammieren?



  • Da sieht man mal wie aufmerksam du hier mitliest. Einen Link zu einer Implementierung so einer Funktion hab ich schon vor einer ganzen Weile hier gepostet 👎



  • Hab ich schon gelesen, aber noch nicht ganz verstanden.
    num soll der zu konvertierende Integer sein und base? Soll das das System sein? Also für das Dezimalsystem zum Beispiel

    char * baseconv(33, 10)

    Stimmt das so?

    Und das was da herauskommt ist dann so wie ein char * c = "33"?



  • Probiers doch einfach mal aus 🙄



  • Danke, es funktioniert!
    Ich war mir unsicher, deshalb habe ich lieber noch einmal nachgefragt 😃


Anmelden zum Antworten