|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2018/9/7 8:17:12 |
标题: |
请求帮助转换java代码为delphi |
浏览:1265 |
|
加入我的收藏 |
楼主: |
我用的是delphixe10.1,在网上找的代码都没用,自己写的base64(md5(str))得到的字符串不对,java中md5得到的字符串是16位的,我得到的是32位的。。。。。所以到这里请求帮助!
import java.io.FileInputStream; import java.io.InputStream; import java.security.MessageDigest;
import sun.misc.BASE64Encoder;
public class Util {
public static String loadFile(String fileName) { InputStream fis; try { fis = new FileInputStream(fileName); byte[] bs = new byte[fis.available()]; fis.read(bs); String res = new String(bs); fis.close(); return res; } catch (Exception e) { throw new RuntimeException(e); } }
public static String md5EncryptAndBase64(String str) { return encodeBase64(md5Encrypt(str)); }
private static byte[] md5Encrypt(String encryptStr) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(encryptStr.getBytes("utf8")); return md5.digest(); } catch (Exception e) { throw new RuntimeException(e); } }
private static String encodeBase64(byte[] b) { sun.misc.BASE64Encoder base64Encode = new BASE64Encoder(); String str = base64Encode.encode(b); return str; }
public static void main(String[] args) { String xml = loadFile(args[0]); String checkword = loadFile(args[1]); System.out.println(md5EncryptAndBase64(xml + checkword)); System.out.println(md5EncryptAndBase64("abc")); System.out.println(md5EncryptAndBase64("中")); } }
下面是我写的代码 var MD5:TIdHashMessageDigest5; base64:TIdEncoderMIME; str:string; begin MD5 := TIdHashMessageDigest5.Create; base64:=TIdEncoderMIME.Create(nil); try base64.FillChar:='='; str:=MD5.HashStringAsHex(tmp); Result:=base64.EncodeBytes(TIdBytes(TEncoding.UTF8.GetBytes(str))); finally MD5.Free; base64.Free; end; end;
这个是要加密的字符串: <Request service="RouteService" lang="zh-CN"><Head>TMZY</Head><Body><RouteRequest tracking_type="1" method_type="1" tracking_number="249071387647"/></Body></Request>XghizSW2NHQKNlR1DT4xrarywqqTyn3F
这个是别人得到的字符 Khxp5cMIRjzi51pJJzOdgQ==
这个是我得到的字符串: RTg3NDg0QkMxRjI0RUY0MUFCODEzNkE3Q0M1QUU5NkQ=
请老大们看看,谢谢!
----------------------------------------------
|
作者: |
|
2018/9/7 8:47:40 |
1楼: |
1 md5 已经是 官方内置了,不需要 indy 2 人家是 Md5 直接返回 Base64 你是 md5 先返回了一个 Hex 字符串,又作为数据源,返回 BASE64,多此一举。 3 同样的 Base64 官方也内置了。
----------------------------------------------
(C)(P)Flying Wang
|
作者: |
|
2018/9/7 9:01:58 |
2楼: |
str:=MD5.HashStringAsHex(tmp); 这里错了, java版并没有AsHex, 你擅自加了AsHex上去
----------------------------------------------
-
|
作者: |
|
2018/9/7 10:39:31 |
3楼: |
多谢各位大佬提醒!改成这样就对了: function TForm8.加密(tmp: string): string; var MD5:TIdHashMessageDigest5; base64:TIdEncoderMIME; str:string; begin MD5 := TIdHashMessageDigest5.Create; base64:=TIdEncoderMIME.Create(nil); try base64.FillChar:='='; //str:=MD5.HashStringAsHex(tmp); //str:=; Result:=base64.EncodeBytes(TIdBytes(MD5.HashString(tmp))); finally MD5.Free; base64.Free; end; end;
----------------------------------------------
|
|