0

50 文字以上の NSData 文字のストリームを受信して​​います。通常、これを NSString に変換してsubStringFromIndex:セレクターを使用しようとしますが、NSString は NULL で終了しているようで (間違っている場合は訂正してください)、データ/文字列の変換をスキップしたいと思います。NSData の特定のインデックスで文字を取得する方法があるかどうかは誰にもわかりませんか? たとえば、次のデータが返されるとします。

<12345678 9abcdefg hjiklmno>

7 と 8 を取り出し、その 2 つだけを取り出したいとしましょう。7 と 8 を取得するために、次のようなことを試してみました。

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(7, -19)];

魅力のように機能します。しかし問題は、ストリームが常に異なる長さになることです。100 文字でも 50 文字でもかまいませんが、必要な 2 つの値が 42 番目と 43 番目の場所にあることは常にわかっています。これを行うための最良の方法の例や知っている人はいますか?

4

2 に答える 2

2

負の長さのコードがクラッシュしないのだろうか。

位置 42、43 の 2 バイトを取得するには、次のようにします。

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(42, 2)];
于 2013-07-17T18:41:35.747 に答える
1

なぜ NSString への変換をスキップしたいのですか?

受け取る文字列は NSData としてエンコードされます。エンコーディングに応じて、各文字は 1 バイトまたは複数バイトとして表されます。UTF8 でエンコードされている場合、一部の文字は 1 バイトで表され、他の文字は 2 バイト以上で表されます。

このため、コードを堅牢にし、さまざまなエンコーディングとさまざまな文字列コンテンツを処理したい場合は、最初に NSData を NSString に変換してから、文字列にインデックスを付ける必要があります。

文字列が UTF-8 でエンコードされている場合は、次のことができます。

NSData *data = ...
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *subString = [str substringFromIndex:...

私の見解では、NSString への変換をスキップするのは、大量のデータを受信し、受信した文字列データのエンコードとコンテンツの両方を制御する場合にのみ意味があります。

ことわざにあるように、時期尚早の最適化は諸悪の根源です。

于 2013-07-17T19:18:34.483 に答える