Java与PHP生成的Base64结果不一致问题排查求助
PHP转Java加密文件处理后图片Base64编码不一致问题
之前发布过相关问题但未完全解决,现再次求助:正在将PHP端已实现的「读取加密文件,按16字节解密后拼接为字符串,再编码为Base64」功能迁移至Java,需保证Java代码输出与服务器运行的PHP代码完全一致。目前解密后的<TextData>文本数据在两端完全一致,但图片数据的Base64编码结果存在差异。
解密后文件格式
<?xml version="1.0" encoding="utf-8" ?> <FileInfo> ... <TextData> (text data) </TextData> </FileInfo> (image data)
PHP端解密处理代码片段
$fileContentArray = array(16); $transContentArray = array(16); $fileRead = fread($fp,16); for($i = 0 ; $i < strlen($fileRead); $i++){ $fileContentArray[$i] = ord($fileRead[$i]); } $seed->SeedDecrypt($fileContentArray,$pdwRoundKey,$transContentArray); $transStr = call_user_func_array("pack",array_merge(array("C16"),$transContentArray)); $mergeStr .= $transStr; } $dataExplode = explode("<TextData>",trim($mergeStr) ); $dataExplode1 = explode("</FileInfo>",trim($dataExplode[1]) ); $dataExplode2 = explode("</TextData>",$dataExplode1[0]); $textData = iconv("EUC-KR","utf-8",$dataExplode2[0]); $imageData = base64_encode(trim($dataExplode1[1]));
Java端对应代码片段
byte[] fileContentArray=new byte[n]; for(int i=0;i<fileContentArray.length;i++){ fileContentArray[i]=mergeArr[nReadCur+i]; } seed.SeedDecrypt(fileContentArray, pdwRoundKey, outbuf); System.arraycopy(outbuf, 0, resultArr, nReadCur, outbuf.length); nReadCur=nReadCur+fileContentArray.length; p=p+fileContentArray.length; if(p>=nFileSize){ fis.close(); break; } }//while mergeStr=new String(resultArr,"MS949"); String[] dataExplode=mergeStr.trim().split("<TextData>"); String[] dataExplode1=dataExplode[1].trim().split("</FileInfo>"); String[] dataExplode2=dataExplode1[0].trim().split("</TextData>"); String textData = ""; String imageData = ""; textData=dataExplode2[0]; imageData=dataExplode1[1]; Encoder encoder=Base64.getEncoder(); Decoder decoder=Base64.getDecoder(); byte[] encArr=encoder.encode(imageData.trim().getBytes("MS949")); imageData=new String(encArr,"MS949");
图片Base64编码结果差异
- PHP结果:
R0lGODlhAwNLBPcAAAAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBVZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/ ... VzpYirO0le55zF0=
- Java结果:
R0lGODlhAwNLBD8AAAAAAAAAMwAAZgAAPwAAPwAAPwArAAArMwArZgArPwArPwArPwBVAABVMwBVZgBVPwBVPwBVPwA/AAA/MwA/ZgA/PwA/PwA/PwA/ ... DAQEAOz9GPz8/IXY=
mergeStr内容差异
- Java端mergeStr:
GIF89aK? 3 f ? ? ? + +3 +f +? +? +? U U3 Uf U? U? U? ? ?3 ?f ?? ?? ?? ? ?3 챖 첌 ぬ ? ? ?3 ?f ?? ... J뇽杞H?*]苛⒢쬝쥻쒳뎁諾X... A?h?~?0a?2$ @삁?d?Dd??e ... ... WC ;홃?뿿!v
- PHP端mergeStr:
GIF89aK? 3 f ? ? + +3 +f +? +? + U U3 Uf U? U? U 3 f ? ? ? ? 챖 첌 ぬ ? ? ? ? ? 螂 ? 3 f ? ? ... A??~?a?$ @삁?d?Dd?e... ... WC ;홃??v余퍙W:X뒽킉??
疑问
- 请问我遗漏了什么?如何让Java结果与PHP一致?
- mergeStr存在未添加的换行符及细微差异,这是否是编码差异导致?会影响Base64转换吗?
已尝试过用UTF-8编码,结果仍不一致;也试过一次性读取文件所有字节:
FileInputStream fis = new FileInputStream(tpf); fis.read(mergeArr);
内容的提问来源于stack exchange,提问作者may
相关产品推荐
相关产品推荐

