64,682
社区成员
发帖
与我相关
我的任务
分享
// 将字符串转化为宽字符
nLength = MultiByteToWideChar(CP_ACP, 0, pMsgBody, -1, NULL, 0);
MultiByteToWideChar(CP_ACP, 0, pMsgBody, -1, szMulti, nLength);
我用过C#相对应于
byte[] unicodemessage = Encoding.Unicode.GetBytes(strmessage);//消息内容
byte[] btInput = Mystring.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
String shadowPassword = byte2hex(md);
C++代码:
string shadowPassword = MD5Encode(Mystring.c_str());
这两段代码的作用都是md5加密后转为hex字符串,输入Mystring都是一样的,但是结果shadowPassword 是不一样的。
C++这段代码加密跟hex转换肯定没有问题,因为我用另一个单独的md5加密和hex转成程序测试过,得到的结果是一样的。
java使用自带函数,肯定也没问题,我怀疑是某部分编码方式不一样造成的。[/quote][/quote]
其实关键问题是java中的那个 getBytes()函数, java中的string使用的unicode编码,无论是英文字母还是汉字,都是用两个字节来表示,而且编码形式是大端在前。getBytes()之后,英文字母变成一个字节,汉字变成三个字节,一个字节无所谓大端小端,三个字节则是大端优先排列。所以getBytes()之后的二进制序列跟C++中的string::c_str()得到的结果根本不一样!
这是我暂时的理解,不知道对不对,
byte[] btInput = Mystring.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
String shadowPassword = byte2hex(md);
C++代码:
string shadowPassword = MD5Encode(Mystring.c_str());
这两段代码的作用都是md5加密后转为hex字符串,输入Mystring都是一样的,但是结果shadowPassword 是不一样的。
C++这段代码加密跟hex转换肯定没有问题,因为我用另一个单独的md5加密和hex转成程序测试过,得到的结果是一样的。
java使用自带函数,肯定也没问题,我怀疑是某部分编码方式不一样造成的。[/quote]
byte[] btInput = Mystring.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
String shadowPassword = byte2hex(md);
C++代码:
string shadowPassword = MD5Encode(Mystring.c_str());
这两段代码的作用都是md5加密后转为hex字符串,输入Mystring都是一样的,但是结果shadowPassword 是不一样的。
C++这段代码加密跟hex转换肯定没有问题,因为我用另一个单独的md5加密和hex转成程序测试过,得到的结果是一样的。
java使用自带函数,肯定也没问题,我怀疑是某部分编码方式不一样造成的。