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