使用Java将十六进制代码转换为exe文件

使用Java将十六进制代码转换为exe文件,java,windows,hex,exe,Java,Windows,Hex,Exe,我试图创建一种压缩/解压算法,现在它可以工作了,我在考虑如何写下解压后的十六进制代码。 我试图将其转换为字节数组,但奇怪的是:结果文件比原始文件大,即使解压的十六进制字符串与原始字符串相等。当我试图打开它时,它给我提供了与当前Windows版本的兼容性问题 为了创建解压缩的exe并在其中写入十六进制代码,我使用了以下代码: FileOutputStream=newfileoutputstream(“Hello2.exe”); stream.write(hex.getBytes()); strea

我试图创建一种压缩/解压算法,现在它可以工作了,我在考虑如何写下解压后的十六进制代码。 我试图将其转换为字节数组,但奇怪的是:
结果文件比原始文件大,即使解压的十六进制字符串与原始字符串相等。当我试图打开它时,它给我提供了与当前Windows版本的兼容性问题
为了创建解压缩的exe并在其中写入十六进制代码,我使用了以下代码:
FileOutputStream=newfileoutputstream(“Hello2.exe”);
stream.write(hex.getBytes());
stream.close()
有什么建议吗?

试试下面的方法

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
,那么hex.getBytes()已经返回了错误的数据。

问题是,您正在将字节读入十六进制字符串,然后直接将十六进制字符串写入文件,而不首先将其转换回相应的字节

假设文件内容是
hello world
。作为字节数组,这是
{0x48、0x65、0x6c、0x6c、0x6f、0x20、0x77、0x6f、0x72、0x6c、0x64}
。将其读入字符串后,就有了
“48656C6F20776F726C64”
。在这个字符串上调用
getBytes()
时,返回以下字节数组:
{0x34、0x38、0x36、0x35、0x36、0x63、0x36、0x66、0x32、0x30、0x37、0x37、0x36、0x46、0x37、0x32、0x36、0x43、0x36、0x34}
。因此,您的输出文件是
48656c6c6f20776F726C64
,而不是
hello world

这是因为您得到的是字符串中每个单独字符的字节表示,而不是字符串表示的十六进制对的字节值


有关将字符串正确转换为字节的方法,请参见此问题:

hex的内容是什么?@Sizik In hex包含以hex转换的exe文件的字节数据。exe文件只是打印hello worldSo,例如,如果二进制数据是
{0x61,0x73,0x64,0x66}
,十六进制字符串是
“61736466”
,还是
“asdf”
?@Sizik我想是的,我只是从文件中读取并使用以下命令转换读取的字节:
string.format(“%02X”,buffer[I])
其中缓冲区是字节数组。不起作用,它给我的错误与前面所说的相同。我试图使用开始时读取的十六进制代码重写exe文件,但给出了相同的错误。您不应该执行我示例中的
Hello2.exe
。使用编辑器查看它。如果
Hello2.exe
的大小不是11字节,则说明您做错了什么。我的答案中的代码确实创建了预期的文件。否则,将我的代码在您的电脑上创建的文件的十六进制转储发布。是的,很抱歉,它创建了一个11字节大小的文件。我认为这是用于检查ms/dos中第一个exe加载程序之一的测试之一。(我以前看到过一个链接,其中谈到了这一点)你知道为什么写文件的原始十六进制代码不起作用吗?我真是个白痴。非常感谢你现在它工作了!