这是一个老话题,但我想补充一些意见。
• 扫描字符串[NSString characterAtIndex]不是很有效。获取 UTF8 中的 C 字符串,然后使用 a 扫描它*char++会快得多。
• 最好按NSMutableData容量分配,以避免耗时的块调整大小。我认为 NSData 更好(见下一点)
• 不是使用 malloc 创建 NSData,然后是[NSData dataWithBytes]free,而是使用 malloc,然后[NSData dataWithBytesNoCopy:length:freeWhenDone:]
它还避免了内存操作(重新分配、复制、释放)。freeWhenDone 布尔值告诉 NSData 获取内存块的所有权,并在它被释放时释放它。
• 这是我必须将十六进制字符串转换为字节块的函数。对输入字符串没有太多的错误检查,但分配是经过测试的。
输入字符串的格式(如删除 0x、空格和标点符号)在转换函数中更好。如果我们确定输入是正确的,为什么我们会浪费一些时间做额外的处理。
+(NSData*)bytesStringToData:(NSString*)bytesString
{
if (!bytesString || !bytesString.length) return NULL;
// Get the c string
const char *scanner=[bytesString cStringUsingEncoding:NSUTF8StringEncoding];
char twoChars[3]={0,0,0};
long bytesBlockSize = formattedBytesString.length/2;
long counter = bytesBlockSize;
Byte *bytesBlock = malloc(bytesBlockSize);
if (!bytesBlock) return NULL;
Byte *writer = bytesBlock;
while (counter--) {
twoChars[0]=*scanner++;
twoChars[1]=*scanner++;
*writer++ = strtol(twoChars, NULL, 16);
}
return[NSData dataWithBytesNoCopy:bytesBlock length:bytesBlockSize freeWhenDone:YES];
}