Я работаю над проектом с flex, bison и c, и мне нужно создать простой компилятор для простого языка, который генерирует байт-код Java непосредственно в файле класса, тогда я смогу выполнить его с помощью java. Проблема связана с байт-кодом Java. Я не знаю, как записать байт-код в шестнадцатеричном формате непосредственно в файл из моей программы на C.
Я попытался вручную с помощью Sublime Text написать «CAFE BABE» и сохранить его с шестнадцатеричной кодировкой. Оно работает. Я пробовал разные fwrite и fprintf, но не могу найти хороший способ сделать это.
FILE *dest = fopen("HelloWorld.class", "wb");
fwrite("CAFEBABE", sizeof(unsigned int), 4, dest);
Я также видел некоторые fprintf с 02x...
fprintf(dest, "%02x", "0xCA");
Я действительно не понимаю, как писать напрямую с шестнадцатеричной кодировкой...
Большое спасибо за любую помощь.
Hex — это текстовое представление чисел. Вы не хотите писать шестнадцатеричный код; вы хотите написать реальные цифры.
Чтобы создать четыре байта CA FE BA BE, вы можете использовать любой из следующих способов:
const unsigned char* bytes = (const unsigned char*)"\xCA\xFE\xBA\xBE";
unsigned char bytes[] = "\xCA\xFE\xBA\xBE";
unsigned char bytes[] = { 0xCA, 0xFE, 0xBA, 0xBE };
Что касается их вывода, fprintf
не идеален. Хотя вы могли бы использовать спецификатор формата %s
, если бы вы убедились, что данные заканчиваются NUL, вы не могли бы фактически вывести NUL, используя его. С другой стороны, fwrite
предназначен для записи произвольных байтов.
Я не уверен, что понимаю вопрос. Код, который я разместил, можно поместить в функцию, да.
Но мне было интересно, как сгенерировать эти байты с «\ x» перед шестнадцатеричными значениями. Если я больше не хочу CA FE BA BE, но AA BB CC DD? Должен ли я заменить все вручную, или это может быть с помощью «функции»?