Написать шестнадцатеричный байт-код java из программы c

Я работаю над проектом с 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");

Я действительно не понимаю, как писать напрямую с шестнадцатеричной кодировкой...

Большое спасибо за любую помощь.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
273
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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? Должен ли я заменить все вручную, или это может быть с помощью «функции»?

vincoooh 28.05.2019 21:26

Я не уверен, что понимаю вопрос. Код, который я разместил, можно поместить в функцию, да.

ikegami 29.05.2019 06:41

Другие вопросы по теме