有人可以帮我了解如何在java中使用下面的代码在ruby中执行的操作。
下面的ruby代码使用 unpack('H *')[0] 以ASCII格式将完整的二进制文件内容存储在变量“var”中。
IO.foreach(ARGV[0]){ |l|
var = l.unpack('H*')[0]
} if File.exists?(ARGV[0])
更新 你好阿鲁。我在下面的表格中测试了你说的方式
byte[] bytes = Files.readAllBytes(testFile.toPath());
str = new String(bytes,StandardCharsets.UTF_8);
System.out.println(str);
但是当我打印变量“str”的内容时,打印输出只显示小方块,就像没有解码内容一样。我想以ASCII格式存储“str”二进制文件的内容。
更新#2: 您好Aru,我正在尝试将所有二进制文件的内容存储在字节数组中,但我不知道该怎么做。有效 “FileUtils.readFileToByteArray(myFile);”但这是一个外部库,是否有内置选项可以做到?
File myFile = new File("./Binaryfile");
byte[] binary = FileUtils.readFileToByteArray(myFile); //I have issues here to store in array of bytes all binary content
String hexString = DatatypeConverter.printHexBinary(binary);
System.out.println(hexString);
更新#3:
你好ursa和Aru,谢谢你的帮助。我已经尝试了两种解决方案并且工作得很好,但是看到了Files.readAllBytes()文档 它说这不是为了处理大文件而我要分析的二进制文件超过2GB :(。我看到你的解决方案的一个选项,阅读 chunk by chunk。二进制文件中的块由FF65序列分隔,所以有没有办法调整你的代码只处理一个块 时间基于块分隔符?如果没有,可能还有一些外部库。
更新#4: 您好,我正在尝试修改您的代码,因为我想读取基于的可变大小的块 “Var”的值。
如何设置偏移量以读取代码中的下一个块?
我是说, - 在第一次迭代中读取第一个1024, - 在此步骤中Var = 500 - 在2d迭代中读取接下来的1024个字节,从1024开始--Var = 1024-500 = 524 - 在此步骤Var = 712 - 在第3次迭代中,从1548开始读取下一个1024字节 - Var = 1548-712 = 836 - 等等是否有像read(字节数,偏移量)的方法?
答案 0 :(得分:0)
你可以使用commons-codec Hex class + commons-io FileUtils class:
byte[] binary = FileUtils.readFileToByteArray(new File("/Users/user/file.bin");
String hexEncoded = Hex.encodeHex(binary);
但如果您只想阅读TEXT文件的内容,可以使用:
String content = FileUtils.readFileToString(new File("/Users/user/file.txt", "ISO-8859-1");
使用JRE 7,您可以使用标准类:
public static void main(String[] args) throws Exception {
Path path = Paths.get("path/to/file");
byte[] data = Files.readAllBytes(path);
char[] hexArray = "0123456789ABCDEF".toCharArray();
char[] hexChars = new char[data.length * 2];
for ( int j = 0; j < data.length; j++ ) {
int v = data[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
System.out.println(new String(hexChars));
}
答案 1 :(得分:0)
这应该做你想要的:
try {
File inputFile = new File("someFile");
byte inputBytes[] = Files.readAllBytes(inputFile.toPath());
String hexCode = DatatypeConverter.printHexBinary(inputBytes);
System.out.println(hexCode);
} catch (IOException e) {
System.err.println("Couldn't read file: " + e);
}
如果您不想一次阅读整个文件,也可以这样做。你需要某种InputStream
。
File inputFile = new File("C:\\Windows\\explorer.exe");
try (InputStream input = new FileInputStream(inputFile)) {
byte inputBytes[] = new byte[1024];
int readBytes;
// Read until all bytes were read
while ((readBytes = input.read(inputBytes)) != -1) {
System.out.printf("%4d bytes were read.\n", readBytes);
System.out.println(DatatypeConverter.printHexBinary(inputBytes));
}
} catch (FileNotFoundException ex) {
System.err.println("Couldn't read file: " + ex);
} catch (IOException ex) {
System.err.println("Error while reading file: " + ex);
}