多年来,我一直使用以下Objective C例程将NSData推送令牌转换为NSString(供Web端推送服务使用),以及反向操作,即获取已知的NSString版本的令牌并重新创建NSData表示。现在,我需要完全相同的功能,但是要用Swift。
dataToHex Objective C代码基本上使用printf格式:
- (NSString *)dataToHex:(NSData *)data
{
NSMutableString *str = [NSMutableString stringWithCapacity:100];
const unsigned char *p = [data bytes];
NSUInteger len = [data length];
for(int i=0; i<len; ++i) {
[str appendFormat:@"%02.2X", p[i]];
}
return str;
}
反向翻译为:
- (NSData *)hexToData:(NSString *)str
{
const char *ptr = [str cStringUsingEncoding:NSASCIIStringEncoding];
NSUInteger len = [str length]/2;
NSMutableData *data = [NSMutableData dataWithCapacity:len];
while(len--) {
char num[5] = (char[]){ '0', 'x', 0, 0, 0 };
num[2] = *ptr++;
num[3] = *ptr++;
uint8_t n = (uint8_t)strtol(num, NULL, 0);
[data appendBytes:&n length:1];
}
return data;
}
通过巧妙地覆盖ASCII数组中的两个字节,"0xXX"字符串被转换为一个字节,然后附加到可变数据对象中。
现在我在使用Swift编程时,需要相同的功能,但没有找到与上述代码类似的Swift文章。
strtol(&num,nil,16)
,则在hexToData0()
中不需要“0x”前缀。 - Martin R