Лучший способ сериализации NSData в шестнадцатеричную строку - PullRequest
97 голосов
/ 20 августа 2009

Я ищу хороший способ какао для сериализации объекта 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;
}

Ответы [ 15 ]

1 голос
/ 29 апреля 2011

Вы всегда можете использовать [yourString uppercaseString] для заглавных букв в описании данных

0 голосов
/ 30 июня 2016

Swift + Property.

Я предпочитаю иметь шестнадцатеричное представление в качестве свойства (аналогично свойствам bytes и description):

extension NSData {

    var hexString: String {

        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count: self.length)
        return buffer.map { String(format: "%02x", $0) }.joinWithSeparator("")
    }

    var heXString: String {

        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count: self.length)
        return buffer.map { String(format: "%02X", $0) }.joinWithSeparator("")
    }
}

Идея заимствована из этого ответа

0 голосов
/ 02 ноября 2013
@implementation NSData (Extn)

- (NSString *)description
{
    NSMutableString *str = [[NSMutableString alloc] init];
    const char *bytes = self.bytes;
    for (int i = 0; i < [self length]; i++) {
        [str appendFormat:@"%02hhX ", bytes[i]];
    }
    return [str autorelease];
}

@end

Now you can call NSLog(@"hex value: %@", data)
0 голосов
/ 08 июля 2010

Измените %08x на %08X, чтобы получить заглавные буквы.

0 голосов
/ 20 августа 2009
[deviceToken description]

Вам нужно удалить пробелы.

Лично я base64 кодирую deviceToken, но это дело вкуса.

...