Iphone CCHmac上的EXC\u坏访问

Iphone CCHmac上的EXC\u坏访问,iphone,objective-c,encoding,exc-bad-access,hmac,Iphone,Objective C,Encoding,Exc Bad Access,Hmac,我正在做HMAC-SHA256编码。尝试过,但没有找到任何解决方案 #include <CommonCrypto/CommonHMAC.h> - (NSString *)hmacWithKey:(NSString *)key andData:(NSString *)data { const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [data cString

我正在做HMAC-SHA256编码。尝试过,但没有找到任何解决方案

#include <CommonCrypto/CommonHMAC.h>

- (NSString *)hmacWithKey:(NSString *)key andData:(NSString *)data
{
const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

///////////////////////////////////////////////////////////////
////but on below line of code i am getting EXC_BAD_ACCESS//////
///////////////////////////////////////////////////////////////

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

//////////////////////////////////////////////

NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];

// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);
return hash;
}
#包括
-(NSString*)hmacWithKey:(NSString*)key和data:(NSString*)data
{
const char*cKey=[key cStringUsingEncoding:NSASCIIStringEncoding];
常量字符*cData=[数据cStringUsingEncoding:NSASCIIStringEncoding];
无符号字符cHMAC[CC_SHA256_DIGEST_LENGTH];
///////////////////////////////////////////////////////////////
////但在下面的代码行中,我得到了EXC\u BAD\u访问权限//////
///////////////////////////////////////////////////////////////
CCHmac(kCCHmacAlgSHA256、cKey、strlen(cKey)、cData、strlen(cData)、cHMAC);
//////////////////////////////////////////////
NSData*out=[NSData dataWithBytes:cHMAC长度:CC_SHA256_DIGEST_length];
//description转换为十六进制,但每4个字节在其周围加上空格
NSString*hash=[out description];
hash=[hash stringByReplacingOccurrencesOfString:@“with string:@]”;
hash=[hash stringByReplacingOccurrencesOfString:@“with string:@]”;
//散列现在是一个字符串,其中只有40char散列值
NSLog(@“%@”,哈希);
返回散列;
}
请告诉我我在这里做什么了。
谢谢

cStringUsingEncoding:NSASCIIStringEncoding
如果字符串包含非ASCII字符,则可以返回
NULL
。 因此,您应该检查
cKey==NULL
cData==NULL

或者更好地转换为UTF-8字符串:

const char *cKey  = [key UTF8String];
const char *cData = [data UTF8String];

我使用示例字符串运行OPs代码,没有错误,因此错误必须在输入中。一个或多个输入为零或非ascii

请提供失败的示例输入

顺便说一句,不必使用字符字符串,下面是使用NSData的示例:

NSData *cKey  = [key  dataUsingEncoding:NSUTF8StringEncoding];
NSData *cData = [data dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *out = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey.bytes, cKey.length, cData.bytes, cData.length, out.mutableBytes);
NSLog(@"out: %@", out);

调试器中显示的错误是什么?它不显示任何内容。没有一个单词,只是在这行上显示EXS_BAD_ACCESS。不要将字符串变量和参数命名为“数据”,这只会使程序更难理解。使用NSLog()查看CCHmac的输入和输出,这是找到问题的最简单的第一步。也没有那人就这么想帮忙只能猜测了。还提供示例输入,以便可以尝试代码。@MuhammadSaadAnsari:输入值
数据
?您是否检查了
cKey
cData
是否为空?令人惊讶的是,人们来到这里问了一个问题,甚至没有在问题周围添加NSLog语句。@MartinR i发送的密钥值为空。非常感谢。