Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MD5哈希在IOS和windows中相同,但在java中不同_Java_C#_Ios_Hash_Md5 - Fatal编程技术网

MD5哈希在IOS和windows中相同,但在java中不同

MD5哈希在IOS和windows中相同,但在java中不同,java,c#,ios,hash,md5,Java,C#,Ios,Hash,Md5,对于IOS和Winows md5哈希,我得到了相同的值,但是对于java,我得到了不同的值 用于md5哈希的IOS代码 - (NSString*)md5HexDigest:(NSString*)input { NSData *data = [input dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5([data

对于IOS和Winows md5哈希,我得到了相同的值,但是对于java,我得到了不同的值

用于md5哈希的IOS代码

- (NSString*)md5HexDigest:(NSString*)input
{
    NSData *data = [input dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([data bytes], (CC_LONG)[data length], result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}
private static string GetMD5(string text)
        {
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] hashValue;
            byte[] message = UE.GetBytes(text);

            MD5 hashString = new MD5CryptoServiceProvider();
            string hex = "";

            hashValue = hashString.ComputeHash(message);
            foreach (byte x in hashValue)
            {
                hex += String.Format("{0:x2}", x);
            }
            return hex;
        }
md5 hasing的Java代码:在UTF-8,16,32中尝试过,但在IOS和Windows中并没有使用

 public String MD5(String md5)  {
   try {

       String dat1 = md5.trim();
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(dat1.getBytes("UTF-16"));
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        System.out.println("Digest(in hex format):: " + sb.toString());
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {
    }
   catch(UnsupportedEncodingException e)
   {
   }
    return null;
}
公共字符串MD5(字符串MD5){
试一试{
字符串dat1=md5.trim();
java.security.MessageDigest md=java.security.MessageDigest.getInstance(“MD5”);
字节[]数组=md.digest(dat1.getBytes(“UTF-16”);
StringBuffer sb=新的StringBuffer();
对于(int i=0;i

感谢这里简要概述了
getBytes()
返回的与指定字符集相关的内容(所有学分归@Kayaman)


它显示仅当未指定尾数时才添加BOM表。如果使用
LE
BE
,则取决于您的体系结构。

如果使用
UTF-16LE
,该怎么办?您奇怪的
整数.tohextString()
代码是否真的给出了正确的结果?UTF-16LE有效,谢谢Kayaman。@Kayaman只是好奇:为什么使用
UTF-16LE
在这里有效?OP现有的代码有什么问题?换句话说,有什么区别?提前感谢。@Unheilig仅使用
UTF-16
将BOM(0xFEFF或0xFFFE)放在开头,以指定尾数。使用
UTF-16BE
UTF-16LE
明确地将BOM排除在外(显然)。Unicode是一个b*tch。
"123".getBytes("UTF-8")   :                31 32 33 
"123".getBytes("UTF-16")  : FE FF 00 31 00 32 00 33 
"123".getBytes("UTF-16LE"):       31 00 32 00 33 00 
"123".getBytes("UTF-16BE"):       00 31 00 32 00 33