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
我遇到了与此线程中完全相同的问题:
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