【问题标题】:Android - Encoding on write/read fileAndroid - 对写入/读取文件进行编码
【发布时间】:2013-04-12 06:32:34
【问题描述】:

我有一个字符串,其中包含来自加密的 2 字节(16 位)ASCII 字符。 然后我用这段代码把它写到一个文件中:

String result = encrypt("text"); //some encryption method
FileOutputStream fos = new FileOutputStream(filename);
fos.write(result.getBytes("ISO-8859-15"));
fos.flush();
fos.close();

问题是当我读取文件时,字符串值已经不​​同了。 下面是我用来读取文件的代码:

InputStream inputStream = new FileInputStream(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "ISO-8859-15"));
String line;
String txt = "";
while ((line = br.readLine()) != null) txt = txt + line;

我发现 String txt 已经不同于 String 结果。我什至做了一个方法来总结字符串中所有字符的 ASCII,发现它不同。 而且我不知道我的错误是什么。请帮忙。

【问题讨论】:

    标签: java android string file encoding


    【解决方案1】:

    如果您已对其进行了加密,则不希望将其写为字符串并应用编码。我知道的每种加密方法都将数据视为字节数组。您需要在加密之前和解密之后进行任何字符集转换。在 Java 中,您甚至不应该将加密后的数据保存为字符串,它应该是一个字节数组。

    此外,没有 16 位 ASCII 这样的东西。 ASCII 是 8 位的。您正在使用某种宽字符数据或 16 位 unicode,而不是 ascii。 http://en.wikipedia.org/wiki/ASCII

    【讨论】:

    • 感谢您的回复。实际上,我之前提到的 16 位 ASCII 就像将 char 类型转换为 long。我使用 long 数据类型进行整个加密(因为我的加密使用 256 位密钥,而 byte 数据类型无法处理那么长的时间)。那么如果我的加密已经在 long 中完成了怎么办?
    • 首先,我希望如果您正在编写自己的加密,这是一个学习练习。加密规则#1 是不要自己编写,除非你是专家。无论如何,加密算法(至少我知道的所有算法)都将字节数组作为输入和输出而不是字符串。这些字节中可能包含文本字符串,但该算法在该级别不起作用。您应该在字符串上调用 .toByteArray,加密该数据,并将其用作您的密文。在解码时,您对其进行解码,然后将该数组再次转换为字符。
    • 我认为是否必须使用 byte[]String 加密并不重要,只要加密有效。但是在将字符串密文写入文件之前,我应该如何处理它呢?如果密文一定是byte[],String.getBytes()不是已经解决了问题吗?但事实并非如此……我不知道为什么。
    • 你是对的...加密不应该使用 String... 我正在将文件写入方法更改为使用 byte[] 手动写入 并且有效!当我阅读文件时也是如此,它必须不是通过读取每行来完成,而是将其读入 byte[]...谢谢顺便说一句!
    猜你喜欢
    • 2018-11-03
    • 2018-05-06
    • 2011-07-07
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多