我有包含hexa数据的String。我希望将其保存为原始hexa文件。
所以我有这样的字符串:
String str ="0105000027476175675C6261636B6772";
我需要做的是,获取将在byte中具有相同数据的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
我的目标是让文件在hexa中具有
01 05 00 00 27 47 61 75 67 5C 62 61 63 6B 67 72
答案 0 :(得分: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 )
您可以逐个写入字节,也可以构造一个数组来存储它们。
将byte
或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();
}
}
答案 1 :(得分: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-A-F能够代表4位。)
答案 2 :(得分:0)
您必须将字符串转换为短数组并存储它。