Swift 中的 UTF16LE(无 BOM 和 0 字节结尾)的 MD5

MD5 of an UTF16LE (without BOM and 0-Byte End) in Swift

我遇到了与此线程中完全相同的问题:

MD5 of an UTF16LE (without BOM and 0-Byte End) in C#

但是,我正在尝试在基于 Swift 4 的 iOS 应用程序中实现这一点。我尝试了

中讨论的所有选项

还有https://github.com/krzyzanowskim/CryptoSwift

但我无法生成正确的 MD5 哈希值。我生成了一个输入字符串的字节数组并删除了字符串末尾的 0 字节,并使用了上面线程中提到的函数。如果有人可以请指出我正确的方向。 基本上 utf8 字符串“1234567z-äbc”应该变成“9e224a41eeefa284df7bb0f26c2913e2”

这就是我到目前为止所尝试的:

        let str = "1234567z" + "-" + "äbc"
        let data = str.data(using: .utf16LittleEndian)!

        let bytesArray = data.map { [=11=] }
        let bytesArrayNoZero = bytesArray.filter{ [=11=] != 0}

        let str2 = String(bytes: bytesArrayNoZero, encoding: String.Encoding.utf16LittleEndian)

        print (fritz_01.MD5(str2!))



 func MD5(string: String) -> Data {
    let messageData = string.data(using:.utf8)!
    var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))

    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }

    return digestData
}

这个

let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!

已经给出了您要计算的 UTF16LE 数据 MD5 hash,无需过滤0字节等操作

相反,修改 的函数以采用 Data 参数 而不是 String:

func MD5(messageData: Data) -> Data {
    var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }
    return digestData
}

以便您可以使用 already-converted 数据调用它:

let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!

let md5Data = MD5(messageData: data)
let md5Hex =  md5Data.map { String(format: "%02hhx", [=12=]) }.joined()

print("md5Hex: \(md5Hex)")
// 9e224a41eeefa284df7bb0f26c2913e2