将NSData序列化为十六进制字符串的最佳方法

将NSData序列化为十六进制字符串的最佳方法

我正在寻找一种很好的可可方式将NSData对象序列化为十六进制字符串。我们的想法是将用于通知的deviceToken序列化,然后再将其发送到我的服务器。

我有以下实现,但我认为必须有一些更短更好的方法来实现它。

+ (NSString*) serializeDeviceToken:(NSData*) deviceToken{
    NSMutableString *str = [NSMutableString stringWithCapacity:64];
    int length = [deviceToken length];
    char *bytes = malloc(sizeof(char) * length);

    [deviceToken getBytes:bytes length:length];

    for (int i = 0; i < length; i++)
    {
        [str appendFormat:@"%02.2hhX", bytes[i]];
    }
    free(bytes);

    return str;}


元芳怎么了
浏览 690回答 3
3回答

小怪兽爱吃肉

使用NSData的description属性不应被视为HEX编码字符串的可接受机制。该属性仅供说明,可随时更改。作为一个注释,在iOS之前,NSData描述属性甚至没有以十六进制形式返回它的数据。很抱歉在解决方案上喋喋不休,但重要的是要花费精力对其进行序列化,而不需要支持除了数据序列化之外的其他方面的API。@implementation&nbsp;NSData&nbsp;(Hex)-&nbsp;(NSString*)hexString{ &nbsp;&nbsp;&nbsp;&nbsp;NSUInteger&nbsp;length&nbsp;=&nbsp;self.length; &nbsp;&nbsp;&nbsp;&nbsp;unichar*&nbsp;hexChars&nbsp;=&nbsp;(unichar*)malloc(sizeof(unichar)&nbsp;*&nbsp;(length*2)); &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char*&nbsp;bytes&nbsp;=&nbsp;(unsigned&nbsp;char*)self.bytes; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(NSUInteger&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unichar&nbsp;c&nbsp;=&nbsp;bytes[i]&nbsp;/&nbsp;16; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c&nbsp;<&nbsp;10)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;+=&nbsp;'0'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;+=&nbsp;'A'&nbsp;-&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hexChars[i*2]&nbsp;=&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;bytes[i]&nbsp;%&nbsp;16; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c&nbsp;<&nbsp;10)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;+=&nbsp;'0'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;+=&nbsp;'A'&nbsp;-&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hexChars[i*2+1]&nbsp;=&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;NSString*&nbsp;retVal&nbsp;=&nbsp;[[NSString&nbsp;alloc]&nbsp;initWithCharactersNoCopy:hexChars&nbsp;length:length*2&nbsp;freeWhenDone:YES]; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[retVal&nbsp;autorelease];}@end
打开App,查看更多内容
随时随地看视频慕课网APP