我想创建一个可以打开二进制文件,以十进制值读取和编辑其内容,然后将其保存回二进制文件的应用程序。
我要打开的该文件具有2个字节写入的多个参数。例如00 06 00 50 01 AB = 6, 80, 427
到目前为止,我设法打开bin文件,将文件中的所有数据放入byte[]
。
这是打开和读取文件的代码:
String path = getFilesDir().getAbsolutePath();
File file = new File(path + "/file.bin");
int size = (int) file.length();
byte[] bytes = new byte[size];
FileInputStream fis = new FileInputStream(file);
try {
fis.read(bytes);
...
} finally {
fis.close();
}
这是第一次尝试将byte[]
转换为十进制值:
for (int i = 0; i < size / 2; i = i + 2) {
intArray[i] = ((bytes[i] & 0xff) << 8) | (bytes[i + 1] & 0xff);
}
但是在此代码中,仅第二个值是正确的。显示为6,0,80,0,1
,应为6,80,1
。
第二个想法是将byte[]
转换为String[]
,然后转换为例如int[]
,但无法正常工作。在此片段中,我没有解析整个数组,而只解析了hexArray[4]
(十六进制为50
,dec为80
,但结果为50
。
for (int i = 0; i < size; i = i + 2) {
num1 = String.format("%02X", bytes[i] & 0xFF);
num2 = String.format("%02X", bytes[i + 1] & 0xFF);
String twoByte = num1 + num2;
hexArrayWithNull[i] = twoByte;
}
String[] hexArray = Arrays.stream(hexArrayWithNull).filter(Objects::nonNull).toArray(String[]::new);
num = String.format("%d", Integer.parseInt(hexArray[4]));
我很困在这里,需要一些指导。我还必须说我是编程新手。 谢谢
答案 0 :(得分:0)
您每次将i
递增2,然后存储在intArray[i]
中。因此,您先存储索引[0],然后存储索引[2],再存储索引[4],依此类推。这解释了奇数索引[1],[3],...
此外,您必须继续循环直到size
,而不是size/2
。
这是正确的循环:
for (int i = 0; i < size; i = i + 2) {
intArray[i/2] = ((bytes[i] & 0xff) << 8) | (bytes[i + 1] & 0xff);
}
这是另一种可能性:
for (int i = 0; i < size/2; i = i + 1) {
intArray[i] = ((bytes[2*i] & 0xff) << 8) | (bytes[2*i + 1] & 0xff);
}
[编辑]
相反的操作是:
for (int i = 0; i < size/2; i = i + 1) {
bytes[2*i] = (intArray[i] & 0xff00) / 256; //or >>8 instead of /256
bytes[2*i+1] = intArray[i] & 0xff;
}