使用Java将Hex代码转换为exe文件

时间:2015-01-16 14:55:54

标签: java windows hex exe

我正在尝试创建一种压缩/解压缩算法,现在我正在考虑如何写下来归档其解压缩的十六进制代码。 我尝试将其转换为字节数组,但发生了一些奇怪的事情:即使解压缩的十六进制字符串和原始字符串相等,结果文件也会比原始文件大。当我尝试打开它时,它会给我Compatibility issue with current Windows version
要创建解压缩的exe,并在其中写入其十六进制代码,我使用此代码:
FileOutputStream stream=new FileOutputStream("Hello2.exe"); stream.write(hex.getBytes()); stream.close(); 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

尝试以下

byte[] hex = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64};
FileOutputStream stream = new FileOutputStream("Hello2.exe");
stream.write(hex);
stream.close();

如果这样创建的Hello2.exe只包含单词hello world,则hex.getBytes()已经返回错误的数据。

答案 1 :(得分:0)

问题在于您将字节读入十六进制字符串,然后将十六进制字符串直接写入文件,而不先将其转换回适当的字节。

我们说文件内容为hello world。作为字节数组,这是{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64}。在将其读入字符串后,您有"48656c6c6f20776F726C64"。当您在此字符串上调用getBytes()时,您将获得以下字节数组:{0x34, 0x38, 0x36, 0x35, 0x36, 0x63, 0x36, 0x63, 0x36, 0x66, 0x32, 0x30, 0x37, 0x37, 0x36, 0x46, 0x37, 0x32, 0x36, 0x43, 0x36, 0x34}。因此,您的输出文件为48656c6c6f20776F726C64,而不是hello world

这是因为您正在获取字符串中每个字符的字节表示,而不是字符串表示的十六进制对的字节值。

有关将字符串正确转换为字节的方法,请参阅此问题:Convert a string representation of a hex dump to a byte array using Java?