Wert in char array binär speichern



  • Hi!

    Ich möchte in ein char array, sprich in einen String, einen Wert schreiben. Aber anstatt den Wert in ASCII Zeichen umzuwandeln möchte ich, dass der Wert binär in das Array gespeichert wird. Ok, einen 1 Byte Wert kann man ja leicht hineinschreiben:

    char array[100];
    char wert = 10;
    
    array[0] = wert;
    

    Aber wie geht das dann mit Werten, die z.B. 2 Byte benötigen bzw. wie kann ich die Variable in 2 1 Byte Variablen spalten?

    Vielen Dank schonmal für eure Hilfe!



  • z.b. mit memcpy

    char array[100];
    short wert = 1000;
    
    memcpy(&array[0], wert, sizeof(short));
    


  • Ok, daruaf hätte ich eigentlich auch selbst kommen können 😃

    Nur aus reiner Neugierde: Geht das auch irgendwie "per Hand". Also Zugriff auf die ersten 8 Bits zu bekommen und diese ins Array zu schreiben?



  • So:

    short x = 234223;
    char xyz[100];
    xyz[0] = x & 0xff;
    xyz[1] = ( x >> 8 ) & 0xff;
    


  • Danke für eure Hilfe!

    Ihr habt mir sehr geholfen!



  • Ok, leider habe ich doch noch ein kleines Problem. Es funktioniert zwar alles wunderbar mit Ganzzahl Variablen, aber mit Float macht der Compiler Probleme:

    int bwrite_data(char *dest, int pos, float source)
    {
    	dest[pos] = source & 0xff;pos++;
    	dest[pos] = (source >> 8) & 0xff;pos++;
    	dest[pos] = (source >> 16) & 0xff;pos++;
    	dest[pos] = (source >> 24) & 0xff;pos++;
    	return pos;
    }
    

    Fehler:
    error C2296: '&': Ungültig, da der linke Operand vom Typ 'float' ist
    error C2296: '>>': Ungültig, da der linke Operand vom Typ 'float' ist

    Warum kann ich keine Float Variablen benutzen? Das sind doch auch nur ganz normale 4 Byte??!



  • grundsätzlich sollte man bitschiebeoperatoren nur mit natürlichen zahlen verwenden, dh auch schon mit signed ist das nicht so günstig, da dafür das 2er-komplement verwendte wird.
    bei fließkommazahlen wird ein richtiges kleines format zur darstellung der zahl verwenden, sodass man hier nichts so leicht verschieben kann. wohin würdest du zb das vorzeichenbit schieben? meistens wird das format ieee 754 für fließkommezahlen verwendet.



  • besserwisser schrieb:

    grundsätzlich sollte man bitschiebeoperatoren nur mit natürlichen zahlen verwenden, dh auch schon mit signed ist das nicht so günstig, da dafür das 2er-komplement verwendte wird.

    Macht doch nichts! 🙂

    @C_Cheaf:
    Dann musst du eben casten, oder eben memcpy (etc) verwenden.



  • Yeah mit casten klappts!

    Danke!



  • Ok, es klappt zwar nur wird leider der Nachkommateil abgeschnitten!

    int bwrite_data(char *dest, int pos, float source)
    {
    	dest[pos] = (long)source & 0xff;pos++;
    	dest[pos] = ((long)source >> 8) & 0xff;pos++;
    	dest[pos] = ((long)source >> 16) & 0xff;pos++;
    	dest[pos] = ((long)source >> 24) & 0xff;pos++;
    	return pos;
    }
    
    long bget_data(char *source, int pos, int size)
    {
    	long return_value = 0; //Wert der am Ende zurückgegeben wird
    	long temp;
    	int i; //Laufvariable
    	int end; //letzte Position die ausgelesen wird
    
    	end = pos+size-1; //berechnet die letzte Position
    	for(i=0;pos<=end;i+=8)
    	{
    		temp = source[pos]; //speichert das Byte
    		return_value |= temp << i; //verschiebt es an seine richtige Position und speichert es
    		pos++;
    	}
    	return return_value; //gibt den Wert zurück
    }
    
    int main() 
    {
    	char test[100];
    	float i = 567.987;
    	float n = 0;
    
    	printf("%d\n",bwrite_data(test,0,i));
    	n = (float)bget_data(test,0,sizeof(float));
    
    	printf("Variable: %f",n);
    	getch();
    }
    

    Ich habe es auch schon mit memcpy probiert:

    int bwrite_data(char *dest, int pos, float source)
    {
    	memcpy((void*)dest[pos],(void*)source,sizeof(float));
    	pos += sizeof(float);
    	return pos;
    }
    

    Leider wird folgende Errornachricht vom Compiler ausgegeben: error C2440: 'Typumwandlung': 'float' kann nicht in 'void *' konvertiert werden

    Weis jemand was ich falsch mache?

    Danke für eure Hilfe!



  • memcpy([b]dest + pos[/b],[b]&source[/b],sizeof(float));
    

    wobei mir nicht ganz klar ist, was du da wirklich machen willst. ich denke, man könnte das mit einem union vielleicht besser lösen.


Anmelden zum Antworten