【问题标题】:Write hex bytecode java from c programm从c程序编写十六进制字节码java
【发布时间】:2019-10-13 09:29:45
【问题描述】:

我正在开发一个带有 flex、bison 和 c 的项目,我必须为一种简单的语言创建一个简单的编译器,该编译器可以直接在 Class 文件中生成 Java 字节码,然后我就可以使用 java 执行它。问题在于 Java 字节码。我不知道如何将十六进制字节码直接写入我的 C 程序中的文件。

我尝试使用 Sublime Text 手动编写“CAFE BABE”并使用十六进制编码保存。有用。我尝试了不同的 fwrite 和 fprintf 但找不到好的方法。

FILE *dest = fopen("HelloWorld.class", "wb");
fwrite("CAFEBABE", sizeof(unsigned int), 4, dest);

我还看到了一些带有 02x 的 fprintf...

fprintf(dest, "%02x", "0xCA");

实在看不懂怎么直接用十六进制编码写……

非常感谢您的帮助。

【问题讨论】:

    标签: java c hex bytecode


    【解决方案1】:

    十六进制是数字的文本表示。你不想写十六进制;你想写出实际的数字。

    要产生四个字节的 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 ?我是否必须手动替换所有内容,还是可以使用“功能”?
    • 我不确定我是否理解这个问题。我贴的代码可以放在一个函数里,是的。
    猜你喜欢
    • 2014-03-08
    • 2019-03-20
    • 2014-03-10
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多