今天在做md5加密的时候,因为硬件端用的是传入char[] 数据进行MD5加密,而我ios端生成的是字符型的数据,在转换过后,最后加密始终得不到跟文档一样的结果,现在终于解决该问题,记录一下。
下面为代码:
//摘要的长度
#define CC_MD5_DIGEST_LENGTH 16
//开辟一个16字节(128位:md5加密出来就是128位/bit)的空间(一个字节=8字位=8个二进制数)
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
//输入的字符是采用16进制的数字,所以这里有一个转化
NSData * testData = [Encryption convertHexStrToData: chrSource];
Byte * byteArray = (Byte *)[testData bytes];
//这里的24,是因为我传递过来的字符是固定长48位的,
char input[24] ={byteArray[0],byteArray[1],byteArray[2],byteArray[3],byteArray[4],byteArray[5],byteArray[6],byteArray[7],byteArray[8],byteArray[9],byteArray[10],byteArray[11],byteArray[12],byteArray[13],byteArray[14],byteArray[15],byteArray[16],byteArray[17],byteArray[18],byteArray[19],byteArray[20],byteArray[21],byteArray[22],byteArray[23]};
// MD5加密, 把str字符串转换成了32位的16进制数列(这个过程不可逆转) 存储到了result这个空间中
CC_MD5(input, (CC_LONG)sizeof(input), buffer);
//转化函数
//16进制转换为NSData
+ (NSData*)convertHexStrToData:(NSString*)str
{
if (!str || [str length] ==0)
{
return nil;
}
NSMutableData *hexData = [[NSMutableData alloc]initWithCapacity:[str length] * 2];
NSRange range;
if ([str length] %2==0)
{
range = NSMakeRange(0,2);
}
else
{
range = NSMakeRange(0,1);
}
for (NSInteger i = range.location; i < [str length]; i +=2)
{
unsigned int anInt;
NSString *hexCharStr = [str substringWithRange:range];
NSScanner *scanner = [[NSScanner alloc]initWithString:hexCharStr];
[scanner scanHexInt:&anInt];
NSData *entity = [[NSData alloc]initWithBytes:&anInt length:1];
[hexData appendData:entity];
range.location+= range.length;
range.length=2;
}
NSLog(@"hexdata: %@", hexData);
return hexData;
}
网友评论