不一致的文件编码读取和写入文件乱码解决方案
2015-09-23 09:31
190 查看
这些天来获得android数据加密中的应用。为了避免加密、解密算法被破解,我将成为核心的加密和解密算法使用JNI封装在一起,只有接口暴露java一层。
工作流程是这种:
1、通过自己写的加密解密工具将数据加密;
2、将加密的数据放在android的asserts目录下;
3、在首次使用数据时将asserts目录下的数据复制到一个隐藏目录下;
4、解密隐藏目录下的文件。
在用加密工具将数据加密好了,在程序解密这个数据文件的过程中,发现解密出来的文件是原来文件大小的2倍,而且全是乱码,跟踪发现,主要问题出如今第3步,读写文件的编码方式不一致导致了文件乱码,之前我是用例如以下的方法来读取asserts目录下的内容的:
问题就出在我将读取出来的内容转换成了字符串,ByteArrayOutputStream的toString方法将文件内容转换成utf-8的编码了,但用C语言读写文件默认都是asii编码方式,读写文件的编码方式不一致导致了乱码问题,问题找到了,解决方法也就出来了,例如以下:
将读取asserts文件的内容以byte数组的形式在它返回。
工作流程是这种:
1、通过自己写的加密解密工具将数据加密;
2、将加密的数据放在android的asserts目录下;
3、在首次使用数据时将asserts目录下的数据复制到一个隐藏目录下;
4、解密隐藏目录下的文件。
在用加密工具将数据加密好了,在程序解密这个数据文件的过程中,发现解密出来的文件是原来文件大小的2倍,而且全是乱码,跟踪发现,主要问题出如今第3步,读写文件的编码方式不一致导致了文件乱码,之前我是用例如以下的方法来读取asserts目录下的内容的:
public static String readFileFromAssets(Context context, String fileName) throws IOException { if (null == context || TextUtils.isEmpty( fileName )){ return null; } AssetManager assetManager = context.getAssets(); InputStream input = assetManager.open(fileName); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = 0; while ((length = input.read(buffer)) != -1) { output.write(buffer, 0, length); } output.close(); input.close(); return output.toString(); }
问题就出在我将读取出来的内容转换成了字符串,ByteArrayOutputStream的toString方法将文件内容转换成utf-8的编码了,但用C语言读写文件默认都是asii编码方式,读写文件的编码方式不一致导致了乱码问题,问题找到了,解决方法也就出来了,例如以下:
public static byte[] readFileFromAssets(Context context, String fileName) throws IOException { if (null == context || TextUtils.isEmpty( fileName )){ return null; } AssetManager assetManager = context.getAssets(); InputStream input = assetManager.open(fileName); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = 0; while ((length = input.read(buffer)) != -1) { output.write(buffer, 0, length); } output.close(); input.close(); return output.toByteArray( ); //return output.toString(); }
将读取asserts文件的内容以byte数组的形式在它返回。
相关文章推荐
- webuploader插件使用分析
- java复习-多线程
- QQ登录-第三方SDK的接入总结
- JSP使用Servlet作为控制器实现MVC模式实例详解
- Eclipse快捷键大全
- [LeetCode]Path Sum
- 一个妹子图应用客户端源码
- 极致体验ajax局部和整体刷新
- (转)面向对象5大基本特征
- 一个妹子图应用客户端源码
- JS 从一个字符串中截取两个字符串之间的字符串
- C# url中文参数值js传递后台接收方法
- proteus 查找 仿真元件 中英文对照 [持续更新]
- 来到华师,一切清零
- proteus 查找 仿真元件 中英文对照 [持续更新]
- GPDB43 Administrator Guide--第八章 使用gptransfer迁移数据
- 创业的第四十六天
- 在没有任何工具下破解开机密码
- 扎根找房子应用源码项目
- 13 种激励程序员的方法