Variabler String binär in Datei schreiben
-
Hallo,
ich möchte einen String der Form
\x01\x01\x08\x0A\...\x00\x00\x00\x00
binär in eine Datei schreiben. Habe dabei an Folgendes gedacht:
FILE *OPTIONS_FILE; if((OPTIONS_FILE = fopen("tmp_options_file", "wb")) == NULL){ fprintf(stderr, "Error creating temporary OPTIONS_FILE!\n"); } else { char option_string[12]="\x01\x01\x08\x0A\x11\x11\x11\x11\x00\x00\x00\x00"; fwrite(&option_string, sizeof(option_string)-1, 1, OPTIONS_FILE); fclose(OPTIONS_FILE); }
Das funktioniert auch ausgezeichnet. Nun habe ich aber das Problem, dass bestimmte Werte (\x11\x11\x11\x11) des Stings variabel sind! Das wollte ich vor dem Schreiben in die Datei mit sprintf() lösen:
sprintf(option_string, "'\x01\x01\x08\x0A\x%s\x%s%s\x%s%s\x%s%s\x00\x00\x00\x00", A, B, C, D, E, F, G) ;
A,C,C,D,E,F,G sind Strings mit den Zahlen die an den entsprechenden Stellen eingesetzt werden sollen. Doch hier bekomme ich vom Compiler die Fehlermeldung "\x used with no folling hex digits"!
Kann mir bitte jemand sagen, wo hier der Fehler ist oder wie ich dieses Problem
eventuell anderst lösen kann?Grüße
-
Die Escape-Folge '\xXX' wird zur Compiletime ausgewertet, nicht zur Runtime und gibt ein einzelnes Zeichen an.
wurschtbix schrieb:
sprintf(option_string, "'\x01\x01\x08\x0A\x%s\x%s%s\x%s%s\x%s%s\x00\x00\x00\x00", A, B, C, D, E, F, G);
Wenn du die Werte für A, ... nicht nur als Strings hast, sondern als tatsächlicher Wert, dann kannst du
sprintf(option_string, "'\x01\x01\x08\x0A%c%c%c%c%c%c%c\x00\x00\x00\x00", A, B, C, D, E, F, G);
machen.
cheers, Swordfish
BTW:
wurschtbix schrieb:
char option_string[12]="\x01\x01\x08\x0A\x11\x11\x11\x11\x00\x00\x00\x00";
"..." sind 13 Zeichen ( 12 Zeichen + '\0')!
-
Hallo Swordfish,
danke für Deine schnelle Hilfe, aber dein Vorschlag funktioniert leider auch nicht.
Zur Info:
Die Variablen A,... sind urprünglich int Variablen (intA,...), die folgende Werte annehmen können:A: 0-255
B: 0-5
C: 0-3
0-2
E: 0-2
F: 0-6
G: 0-6Diese werden per Zufallsgenerator generiert und sollen anschließend den besagten Part (\xA\xBC\xDE\xFG) des Hexcodes bilden.
Ich dachte das wäre mit sprintf() möglich, indem ich die Variablen mit
itoa(intA, A, 16); ...
in "Hex"-Strings umwandle und mit sprintf einsetze:
sprintf(option_string, "'\x01\x01\x08\x0A\x%s\x%s%s\x%s%s\x%s%s\x00\x00\x00\x00", A, B, C, D, E, F, G);
Wie könnte ich dieses Problem lösen?
Grüße
-
Wie äußert sich
wurschtbix schrieb:
funktioniert leider auch nicht.
?
-
Der Compiler meldet bei
sprintf(buffer, "'\x01\x01\x08\x0A%c%c%c%c%c%c%c\x00\x00\x00\x00", A, B, C, D, E, F,G);
Folgendes:
main.c|311|warning: int format, pointer arg (arg 3)| main.c|311|warning: int format, pointer arg (arg 4)| main.c|311|warning: int format, pointer arg (arg 5)| main.c|311|warning: int format, pointer arg (arg 6)| main.c|311|warning: int format, pointer arg (arg 7)| main.c|311|warning: int format, pointer arg (arg 8)| main.c|311|warning: int format, pointer arg (arg 9)|
Die Datei wird zwar angelegt und es wird in Datei geschreiben, aber sie liegt dann nicht binär vor, sondern als Textdatei?
Eigentlich sollte die Datei in Ultraedit, nachdem \x01\x01\x08\x0A\x11\x11\x11\x11\x00\x00\x00\x00 mit fwrite geschreiben wurde, so aussehen:
00000000h: 01 01 08 0A 11 11 11 11 00 00 00 00 ; ............
Mein Ziel ist aber "11 11 11 11" durch A BC DE FG zu ersetzen.
Wenn ich dies nach Deiner Methode versuche, sieht die Datei in Ultraedit folgendermaßen aus:' @ ð0
Kannst Du mir da bitte weiterhelfen!
Grüße
-
Hi, versuch mal das hier:
#include <stdio.h> int main (void) { unsigned char o[12] = {0x01, 0x01, 0x08, 0x0a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; FILE *fp = fopen("mcr", "wb"); o[4] = 0x11; /* hier kannst du A */ o[5] = 0x1a; /* BC */ o[6] = 0xa1; /* DE */ o[7] = 0xff; /* FG */ fwrite(o, 1, 12, fp); fclose(fp); return 0; }
Du kannst die Stellen 4-7 einfach per Zahlen (unsigned char) übergeben.
Gruß mcr
-
Ah, da hab' ich übersehen, dass Du die einzelnen Bytes noch zusammenbasteln willst
cheers, Swordfish
-
Hallo mcr,
Dein Lösungsvorschlag klingt sehr vielversprechend. Mit der int Variable intA funktioniert das auch ganz ausgezeichnet. Mit der String Variable A dagegen nicht. Meine Frage ist daher, wie kann ich die übrigen int Variablen intB, intC, ... so miteinander verbinden, dass daraus der richtige Hexcode entsteht?
Zur Verdeutlichung:
Hat int A den Wert 187, so steht mito[4]=intA;
wie gewünscht der Wert 0xbb an der Stelle o[5] in der Datei. Wie kann ich es aber erreichen, dass wenn intB den Wert 1 und intC den Wert 2 hat , an der Stelle o[5] /* BC */ der Wert 0x12 steht?
Grüße
-
Hat denn niemand eine Idee wie ich das Problem lösen könnte?
Grüße
-
wurschtbix schrieb:
Wie kann ich es aber erreichen, dass wenn intB den Wert 1 und intC den Wert 2 hat , an der Stelle o[5] /* BC */ der Wert 0x12 steht?
...Bytebastelstunde mit Bitshifts:
o[5] = ( ( intB & 0x0f ) << 4 ) | ( intC & 0x0f );
cheers, Swordfish