C - Datenbereich mit hex-Daten füllen

Herakles

Profifragensteller
Mahlzeit!

Wie bekomme ich es hin, unter C einen ganzen Speicherbereich mit Daten zu befüllen, die ich hexadezimal angeben möchte?

Mir schwebt so etwas vor:

Code:
#define VERSUCH 0xaabbccddeeffaabbccddeeff

int main (void) {
   char *daten;
   daten = malloc(12);
   daten = VERSUCH;
}

Mit einem uint32_t zum Beispiel ist sowas kein Problem:

Code:
#define VERSUCH_INT 0xaabbccdd

int main (void) {
    uint32_t int_daten;
    int_daten = VERSUCH_INT;

Ich denke, ich habe gerade einfach nur ein Brett vor'm Kopf. Falls das so ist, wer nimmt es bitte kurz weg?
 
So sollte es, denke ich mal, funktionieren:
Code:
#define VERSUCH 0xaabbccddeeffaabbccddeeff

int main(void)
{
	char *daten;
	daten = malloc(12); //wobei ich malloc() so noch nie gessehen habe...
	*daten = VERSUCH; //Eventuell ist hier eine explizite Typkonvertierung nach char von Nöten.
}

Aber keine Garantie, dass es auch wirklich klappt. :)
 
das wirst du mit einem define leider so nicht hinkriegen.
gcc arbeitet intern schliesslich auch mit hoechstens 64 bit, da kannst du dann nicht einfach per define eine 96 bit zahl nehmen.

mache das ganze lieber irgendwie so:

Code:
const unsigned char datenrom[]={0xaa,0xbb,0xcc,0xdd,0xee,0xff,0x00,0x11,...};

....

int main(void)
{
	char *daten;
	daten = malloc(12); //wobei ich malloc() so noch nie gessehen habe...
	memcpy(daten,datenrom,12);
}
 
Deine einzige Möglichkeit ist es als char[] zu machen "0xaabbcc..." und den dann zu parsen, wenn du auf die Array Syntax verzichten willst.
 
Der Grund ist, dass man einfache Datentypen in C einfach per "=" zuweisen kann. Du kannst so etwas nicht mit Speicherbereichen machen.

Und so ein langen einfachen Integer-Datentyp, wie Du den im #define verlangst, gibt es nicht. Deswegen: Arrays nutzen, wie die anderen es vorgeschlagen haben.
 
Wenns hex ist, siehe dettus. Wenns binär ist:

Code:
$ cat >foo.S <<-'EOF'
.data
.globl datenrom
.type datenrom,@function
datenrom:
.incbin "foo.bin"
.size datenrom,(. - datenrom)
EOF

Und dann einfach die foo.S mit in SRCS ins Makefile eintragen. Tut mit allen
GNU binutils aus diesem Jahrtausend (und vorher).

Bei a.out, COFF, ECOFF, PE, etc. noch einen Unterstrich vorhängen, oder das
Ganze sicherheitshalber so abwandeln:

Code:
$ cat >foo.S <<-'EOF'
.data
.globl datenrom
.globl _datenrom
datenrom:
_datenrom:
.incbin "foo.bin"
EOF

Eine weitere Alternative, da *.S Dateien vom gcc præprozesst werden:

Code:
$ cat >foo.S <<-'EOF'
#ifdef __ELF__
#define _C_LABEL(x) x
#else
#define _C_LABEL(x) _ ## x
#endif
.data
.globl _C_LABEL(datenrom)
#ifdef __ELF__
.type _C_LABEL(datenrom),@function
#endif
_C_LABEL(datenrom):
.incbin "foo.bin"
#ifdef __ELF__
.size _C_LABEL(datenrom),(. - _C_LABEL(datenrom))
#endif
EOF
 
Zurück
Oben