我想使用swift中的键创建字符串的SHA1 hmac哈希。在obj-c中我使用了它并且效果很好:
+(NSString *)sha1FromMessage:(NSString *)message{
const char *cKey = [API_KEY cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [message cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%s", cData);
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
for (int i = 0; i < HMACData.length; ++i){
[HMAC appendFormat:@"%02hhx", buffer[i]];
}
return HMAC;
}
但是现在我很难把它翻译成快速的。这就是我到目前为止所做的:
static func sha1FromMessage(message: String){
let cKey = RestUtils.apiKey.cStringUsingEncoding(NSASCIIStringEncoding)!
let cData = message.cStringUsingEncoding(NSUTF8StringEncoding)!
let cHMAC = [CUnsignedChar](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CCHmac(kCCHmacAlgSHA1, cKey, cKey.count, cData, cData.count, cHMAC)
...
}
和这一行
CCHmac(kCCHmacAlgSHA1, cKey, cKey.count, cData, cData.count, cHMAC)
已经给我一个错误 Int无法转换为CCHmacAlgorithm 。有关如何将obj-c代码翻译为swift的任何想法吗?
答案 0 :(得分:1)
CCHmac()
函数的最后一个参数的类型为UnsafeMutablePointer<Void>
,因为
结果写入的地方。您必须将cHMAC
声明为变量
并将其作为 in-out表达式传递给&
。此外,还有一些类型的转换
是必要的:
var cHMAC = [CUnsignedChar](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey, UInt(cKey.count), cData, UInt(cData.count), &cHMAC)
答案 1 :(得分:0)
Apple枚举值在Swift中的定义不同。而不是kCCHmacAlgSHA1
,它可能定义为CCHmacAlgorithm.SHA1
。