10

[NSData bytes]1 つずつ反復処理して に追加したり、NSMutableStringを使用して印刷したりするにはどうすればよいNSLog()ですか?

4

2 に答える 2

32

変更可能な文字列にバイトを追加するのではなく、データを使用して文字列を作成します。

// Be sure to use the right encoding:
NSString *result = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

本当にバイトをループしたい場合:

NSMutableString *result = [NSMutableString string];
const char *bytes = [myData bytes];
for (int i = 0; i < [myData length]; i++)
{
    [result appendFormat:@"%02hhx", (unsigned char)bytes[i]];
}
于 2012-05-06T20:36:52.943 に答える
13

アップデート!iOS 7 以降、NSData オブジェクト内のすべてのバイトを反復処理するための新しい推奨される方法があります。

NSDataは内部で複数のバラバラなバイト配列チャンクで構成できるようになったため、呼び出し元のすべての基になるチャンクを単一のバイト配列にフラット化する必要があるため、呼び出しは[NSData bytes]メモリ効率が悪い場合があります。

この動作を回避するにenumerateByteRangesUsingBlock:は、NSData のメソッドを使用してバイトを列挙することをお勧めします。これにより、既存の基になるチャンクの範囲が返され、新しい配列構造を生成する必要なく直接アクセスできます。もちろん、提供されている C スタイルの配列を不適切にいじらないように注意する必要があります。

NSMutableString* resultAsHexBytes = [NSMutableString string];

[data enumerateByteRangesUsingBlock:^(const void *bytes,
                                    NSRange byteRange,
                                    BOOL *stop) {

    //To print raw byte values as hex
    for (NSUInteger i = 0; i < byteRange.length; ++i) {
        [resultAsHexBytes appendFormat:@"%02x", ((uint8_t*)bytes)[i]];
    }

}];
于 2014-11-20T22:14:24.207 に答える