问题描述
我正在寻找一种很好的可可方式将NSData对象序列化为十六进制字符串。我的想法是将用于通知的deviceToken序列化,然后再将其发送到我的服务器。
I am looking for a nice-cocoa way to serialize an NSData object into a hexadecimal string. The idea is to serialize the deviceToken used for notification before sending it to my server.
我有以下实现,但我认为必须有一些更短更好的方法要做到这一点。
I have the following implementation, but I am thinking there must be some shorter and nicer way to do it.
+ (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;
}
推荐答案
这是一个适用于的类别我写的NSData。它返回表示NSData的十六进制NSString,其中数据可以是任意长度。如果NSData为空,则返回空字符串。
This is a category applied to NSData that I wrote. It returns a hexadecimal NSString representing the NSData, where the data can be any length. Returns an empty string if NSData is empty.
NSData + Conversion.h
#import <Foundation/Foundation.h>
@interface NSData (NSData_Conversion)
#pragma mark - String Conversion
- (NSString *)hexadecimalString;
@end
NSData + Conversion.m
#import "NSData+Conversion.h"
@implementation NSData (NSData_Conversion)
#pragma mark - String Conversion
- (NSString *)hexadecimalString {
/* Returns hexadecimal string of NSData. Empty string if data is empty. */
const unsigned char *dataBuffer = (const unsigned char *)[self bytes];
if (!dataBuffer)
return [NSString string];
NSUInteger dataLength = [self length];
NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
for (int i = 0; i < dataLength; ++i)
[hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]];
return [NSString stringWithString:hexString];
}
@end
用法:
NSData *someData = ...;
NSString *someDataHexadecimalString = [someData hexadecimalString];
这可能比调用 [someData description] $更好c $ c>然后剥离空格,< s和>。剥离字符只是感觉太hacky。此外,您永远不会知道Apple将来是否会更改NSData的
-description
的格式。
This is "probably" better than calling [someData description]
and then stripping the spaces, <'s, and >'s. Stripping characters just feels too "hacky". Plus you never know if Apple will change the formatting of NSData's -description
in the future.
注意:我已经让人们联系我这个答案的代码许可。我特此将我在此公共领域的答案中公布的代码的版权保留给我。
NOTE: I have had people reach out to me about licensing for the code in this answer. I hereby dedicate my copyright in the code I posted in this answer to the public domain.
这篇关于将NSData序列化为十六进制字符串的最佳方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!