2012-05-06 8 views

答えて

28

むしろ可変文字列にバイトを追加するよりも、データを使用して文字列を作成します。

// 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]]; 
} 
+0

doSomethingWithChar行はどのようにする必要がありますか?バイトの16進表現をNSMutableStringに追加したいのですか? – yannis

+0

nsdataが実際に文字列でない場合はどうなりますか? 0x00バイトが含まれていると、データ全体を反復処理することができません。 –

11

更新! iOS 7以来、NSDataオブジェクトのすべてのバイトを反復処理する、新しい、好ましい方法があります。

NSDataは、今では、発信者のための単一のバイト配列に基礎となるチャンクの全てをフラット化する必要があるため[NSData bytes]は時々、メモリ効率が悪い呼び出し、ボンネットの下に複数の互いに素バイト配列チャンクで構成することができますので。

この問題を回避するには、NSDataのenumerateByteRangesUsingBlock:メソッドを使用してバイトを列挙することをお勧めします。既存のチャンクの範囲を返します。新しい配列構造を生成することなく直接アクセスできます。もちろん、指定された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]]; 
    } 

}];