原文網址:http://www.voidcn.com/blog/u012198553/article/p-4976772.html
/// 將十六進制的字符串轉化為NSData
- (NSData )transStrHexToData:(NSString )strHex
{
/// bytes索引
NSUInteger j = 0;
NSInteger len = strHex.length; if (len % 2 == 1) { /// 若不能被2整除則說明16進制的字符串不滿足圖片圖。特此說明,假如只是單純的把十六進制轉換為NSData就把這個if干掉即可, return nil; } /// 動態分配內存 Byte *bytes = (Byte *)malloc((len / 2 + 1) * sizeof(Byte)); /// 初始化內存 其中memset的作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法 memset(bytes, '\0', (len / 2 + 1) * sizeof(Byte)); /// for循環里面其實就是把16進制的字符串轉化為字節數組的過程 for (NSUInteger i = 0; i < strHex.length; i += 2) { /// 一字節byte是8位(比特)bit 一位就代表一個0或者1(即二進制) 每8位(bit)組成一個字節(Byte) 所以每一次取2為字符組合成一個字節 其實就是2個16進制的字符其實就是8位(bit)即一個字節byte NSString *str = [strHex substringWithRange:NSMakeRange(i, 2)]; /// 將16進制字符串轉化為十進制 unsigned long uint_ch = strtoul([str UTF8String], 0, 16); bytes[j] = uint_ch; /// 自增 j ++; } /// 將字節數組轉化為NSData NSData *data = [[NSData alloc] initWithBytes:bytes length:len / 2]; /// 釋放內存 free(bytes); return data;
}