【问题标题】:How to edit binary file in Android?如何在Android中编辑二进制文件?
【发布时间】:2019-10-22 00:20:51
【问题描述】:

我想创建一个可以打开二进制文件的应用程序,读取和编辑十进制值的内容,然后将其保存回二进制文件。

我要打开的这个文件有多个以 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 和十进制的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]));

我被困在这里,需要一些指导。我还必须说我是编程新手。 谢谢

【问题讨论】:

    标签: java android arrays file binary


    【解决方案1】:

    您在每次迭代中将 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;
    }
    

    【讨论】:

    • intArray[i/2] 完美运行。谢谢。现在只是如何将其反转并将其写回二进制文件。
    • 如果解决方案很好,感谢您投票并将答案标记为“解决方案”。
    猜你喜欢
    • 2010-12-27
    • 2020-03-21
    • 1970-01-01
    • 2013-04-08
    • 2020-08-23
    • 2011-06-03
    • 2010-11-01
    • 2018-11-08
    • 2015-08-27
    相关资源
    最近更新 更多