may
may

Reputation: 1

Is there a way to read files in bytes?

I am working on changing the code completed with php to java. I have a test.tpf file encrypted with SEED and the file is encoded in ANSI. The test.tpf file contains a string and image information for base64 encoding and output. I have to cut 16 bytes each and read the file to decrypt test.tpf. So I used fileInputStream to save and decrypt the bytes that I read in a 16-size byte array.

            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

Then, they encoded the part corresponding to the image information in base64. In js, the base64 code was changed to a string to receive the string and base64 information in json and display it on the screen.

                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);

However, it seems that the file cannot be read properly. Compared to the result value of the php code I have, the string is incorrectly entered. My Eclipse basic encoding is UTF8, so I think this problem is due to encoding.When I read files using fileInputStream, I wanted to set up characters and read them. I don't know how to read bytes at this time.

How can I read files 16 bytes at a time after setting up the encoding? Also, I would like to know if there is a mistake in my code.

My java version is 1.8 and I use spring 3.1.1

++)add

I succeeded in making a 16-size outbuf array into one array using the ByteArrayOutputStream.

ByteArrayOutputStream baos =new ByteArrayOutputStream(); 

.
.
.

        seed.SeedDecrypt(fileContentArray, pdwRoundKey, outbuf);

        baos.write(outbuf, 0, 16);
        break;   
    }
}//while

mergeStr=new String(baos.toByteArray(),"MS949");
.
.
.

However, compared to the php code I have, I found that the result value of php is different from the result value of java.

in java:System.out.println("mergeStr:"+mergeStr.length()+" / image:"+imageData.length());

java console: mergeStr:69716 / image:168092

in php:alog("mergeStr: ".strlen($mergeStr)." / imageData : ".strlen($imageData ));

php log: mergeStr: 85552 / imageData: 111860

Since the result string decoded by java and php is different, the result of java and php is different for the value encoded by imageData as base64

Upvotes: 0

Views: 104

Answers (1)

queeg
queeg

Reputation: 9463

When you read a file in bytes, there is no encoding. Only when you convert/interprete the bytes as characters, encoding becomes important.

So if you want to stick to reading bytes, FileInputStream is the way. If you want to read characters, a FileReader is the way.

Note you can specify the encoding to be used on the constructor - which is necessary if the file is not in the system default encoding.

Edit: How can I read files 16 bytes at a time after setting up the encoding?

You simply cannot. But you can read 16 bytes, then when you convert to String specify the encoding.

Upvotes: 1

Related Questions