我是Java的新手,我在Android Studio 3.1x上编写了一个移动应用程序。
我需要将二进制文件读取为String。 (例如:abc.dll)
需要编辑该字符串的某些部分,然后写回另一个二进制文件。 例如:efg.dll
我可以做的很好,但是当我读为String时,String看起来不同且长度错误。
我知道我可以修补该byte []并将字节[]重新写为efg.dll。 但是由于某种原因,我需要转换为String并返回到byte []并写入efg.dll。
我的伪代码如下:
String FileBuffer ="";
int FileLength = 0;
//I store abc.dll inside raw folder
InputStream ipsSysTemplate = getResources().openRawResource(R.raw.abc);
FileLength = ipsSysTemplate.available();
byte[] buf = new byte[FileLength];
ipsSysTemplate.read(buf);
ipsSysTemplate.close();
FileBuffer = new String(buf);
//I even tried many Charset like "UTF-8", "windows-1252" etc...
//FileBuffer = new String(buf,"UTF-8");
//I need both length must be same, but I get different
System.out.println(FileLength + " " + FileBuffer.length());
//Finally I write a new binary file efg.dll from below code
File file = new File(/storage/emulated/0/Download/efg.dll);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(FileBuffer.getBytes());
fos.close();
当我在Window 7的Eclipse中执行此类似代码时,我得到了预期的结果。 但是在那种情况下,我将模板abc.dll放在硬盘上。
我不知道问题出在哪里,我需要了解更多... 关于Java或Android手机的概念。
请问一些专家能理解我的问题并给我一个简单的解决方案吗?
这是两个文件照看我的代码的方式。 please have a look at this image
预先感谢...
gaamaa
答案 0 :(得分:0)
不要使用字符串来处理二进制数据。您的二进制查看器可能会以原始ascii形式呈现文本,这是char与字节的一对一关系。但是,大多数现代字符集都不遵循这一点。实际上,unicode定义了每个字符可变数量的字节。
如果确实要,可以将数组中的每个byte
强制转换为char
,然后将其输入String。但是,我建议找到一种仅使用byte[]
甚至使用ByteBuffer
的方法。