spring 有没有办法以字节为单位读取文件?

slmsl1lt  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(154)

我正在将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的结果也不同

zengzsys

zengzsys1#

当你以字节为单位读取文件时,没有编码。只有当你将字节转换/解释为字符时,编码才变得重要。
因此,如果你想坚持阅读字节,FileInputStream是一种方法。如果你想读字符,FileReader是一种方法。
请注意,您可以指定要在建构函式上使用的编码方式-如果档案不是使用系统预设编码方式,则必须指定。

编辑:* 设置编码后,如何一次读取16字节的文件?*

但是你可以读取16个字节,然后在转换为String时指定编码。

相关问题