我正在将php完成的代码更改为java。我有一个用SEED加密的test.tpf文件,该文件是用ANSI编码的。test.tpf文件包含base64编码和输出的字符串和图像信息。我必须分别剪切16个字节,然后读取文件来解密test.tpf。因此,我使用fileInputStream来保存和解密我在16字节数组中读取的字节。
int nReadCur=0;
byte[] outbuf = new byte[16];
int nRead =0;
FileInputStream fis = new FileInputStream(tpf);
while (true) {
byte[] fileContentArray=new byte[16];
nRead = fis.read(fileContentArray);
nReadCur = nReadCur + nRead;
seed.SeedDecrypt(fileContentArray, pdwRoundKey, outbuf); //Decryption
String dbgmsg =new String(outbuf,"MS949");
mergeStr+=dbgmsg;
if(nFileSize<=nReadCur || nRead==-1)
break;
}//while
然后,他们用base64对图像信息对应的部分进行编码,在js中,base64代码被改为字符串,以接收json中的字符串和base64信息,并将其显示在屏幕上。
String[] dataExplode=mergeStr.split("<TextData>");
String[] dataExplode1=dataExplode[1].split("</FileInfo>");
String[] dataExplode2=dataExplode1[0].split("</TextData>");
String textData = null;
String imageData = null;
textData=dataExplode2[0];
imageData=dataExplode1[1];
Encoder encoder=Base64.getEncoder();
imageData=encoder.encodeToString(imageData.getBytes());
JSONArray ja=new JSONArray();
ja.put(textData);
ja.put(imageData);
result.put("imageContent", ja);
但是,看起来文件无法正确读取。与我所拥有的php代码的结果值相比,字符串输入错误。我的Eclipse基本编码是UTF8,所以我认为这个问题是由于编码。当我使用fileInputStream读取文件时,我想设置字符并读取它们。此时我不知道如何读取字节。
如何在设置编码后一次读取16字节的文件?另外,我想知道我的代码是否有错误。
我的java版本是1.8,我使用的是spring 3.1.1
++)添加
我使用ByteArrayOutputStream成功地将一个大小为16的outbuf数组转换为一个数组。
ByteArrayOutputStream baos =new ByteArrayOutputStream();
.
.
.
seed.SeedDecrypt(fileContentArray, pdwRoundKey, outbuf);
baos.write(outbuf, 0, 16);
break;
}
}//while
mergeStr=new String(baos.toByteArray(),"MS949");
.
.
.
但是,与我拥有的php代码相比,我发现php的结果值与java的结果值不同。
在java中:System.out.println("mergeStr:"+mergeStr.length()+" / image:"+imageData.length());
Java控制台:mergeStr:69716 / image:168092
在php中:alog("mergeStr: ".strlen($mergeStr)." / imageData : ".strlen($imageData ));
php日志:mergeStr: 85552 / imageData: 111860
由于java和php解码的结果字符串不同,因此对于imageData编码为base64的值,java和php的结果也不同
1条答案
按热度按时间zengzsys1#
当你以字节为单位读取文件时,没有编码。只有当你将字节转换/解释为字符时,编码才变得重要。
因此,如果你想坚持阅读字节,FileInputStream是一种方法。如果你想读字符,FileReader是一种方法。
请注意,您可以指定要在建构函式上使用的编码方式-如果档案不是使用系统预设编码方式,则必须指定。
编辑:* 设置编码后,如何一次读取16字节的文件?*
但是你可以读取16个字节,然后在转换为String时指定编码。