1. ホーム
  2. iphone

[解決済み] NSDataを16進文字列にシリアライズする最良の方法

2022-12-28 07:30:48

質問

NSDataオブジェクトを16進数の文字列にシリアライズするための素敵なcocoaの方法を探しています。アイデアは、私のサーバーに送信する前に、通知に使用される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;
}

どのように解決するのですか?

これは、私が書いたNSDataに適用されるカテゴリです。NSDataを16進数のNSStringで表し、データは任意の長さにできます。NSDataが空の場合は空文字列を返します。

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] を呼び出して、スペース、<'s、>'s を除去するよりも良い方法です。文字を削除するのは、あまりにもハチャメチャな感じがします。さらに、Apple が NSData の書式を変更するかどうかはわかりません。 -description のフォーマットを変更するかもしれません。

注意 この回答にあるコードのライセンスについて、私に接触してきた人々がいました。私はここに、この回答で投稿したコードの私の著作権をパブリックドメインに捧げます。