2

我有包含六进制数据的字符串。我希望将其保存为原始 hexa 文件。

所以我有这样的字符串:

String str ="0105000027476175675C6261636B6772";

我必须做的是获取 file.hex,它将在字节中具有相同的数据。

当我尝试这样做时:

PrintStream out = new PrintStream("c:/file.hex");
out.print(str);

我得到的文件有

“0105000027476175675C6261636B6772”

但在六边形中是:

30 31 30 35 30 30 30 30 32 37 34 37 36 31 37 35 36 37 35 43 36 32 36 31 36 33 36 42 36 37 37 32

我的目标是在六角文件中拥有

01 05 00 00 27 47 61 75 67 5C 62 61 63 6B 67 72

4

3 回答 3

4

两个六进制数字组成一个字节。

File file = new File("yourFilePath");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));

现在,遍历字符串,使用string.substring()方法一次获取两个字符。

你会认为这Byte.parseByte(theTwoChars, 16)是一个不错的选择,但它会失败得很惨,因为它认为字节是有符号的。您应该改用:

byte b = (byte) ( Integer.parseInt(theTwoChars, 16) & 0xFF )

您可以一个接一个地写入字节,也可以构造一个数组来存储它们。

byteor写入byte[]输出流:

bos.write(bytes);

最后,关闭流:

bos.close();

这是我为演示它而制作的一个完整的工作方法:

public static void bytesToFile(String str, File file) throws IOException {
    BufferedOutputStream bos = null;
    try {

        // check for invalid string    
        if(str.length() % 2 != 0) {
            throw new IllegalArgumentException("Hexa string length is not even.");
        }

        if(!str.matches("[0-9a-fA-F]+")) {
            throw new IllegalArgumentException("Hexa string contains invalid characters.");
        }

        // prepare output stream
        bos = new BufferedOutputStream(new FileOutputStream(file));

        // go through the string and make a byte array
        byte[] bytes = new byte[str.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            String twoChars = str.substring(2 * i, 2 * i + 2);

            int asInt = Integer.parseInt(twoChars, 16);

            bytes[i] = (byte) (asInt & 0xFF);
        }

        // write bytes
        bos.write(bytes);

    } finally {
        if (bos != null) bos.close();
    }
}
于 2013-07-31T13:21:31.340 回答
2
assert str.length() % 2 == 0; // Two hexadecimal digits for a byte.
byte[] bytes = new byte[str.length() / 2];
for (int i = 0; i < bytes.length; ++i) {
    String byteRepr = str.substring(2 * i, 2 * i + 2);
    byte b = Byte.parseByte(byteRepr, 16); // Base 16
    bytes[i] = b;
}

Files.write(Paths.get("c:/file.bin"), bytes, StandardOpenOption.WRITE);
// Or use a FileOutputStream with write(bytes);

(关于术语:十六进制,来自希腊语,表示 16,计数基数;一位数字 0-9-AF 可以表示 4 位。)

于 2013-07-31T13:23:57.587 回答
0

您必须将您的字符串转换为一个短数组并存储它。

于 2013-07-31T13:18:40.157 回答