NSString *counter = [[NSString alloc] initWithBytes:buffer+1 length:11 encoding:NSUTF8StringEncoding]; //@"003{of}004"
NSString *c1Str = [counter substringToIndex:4];
NSString *c2Str = [counter substringFromIndex:8];
int c1Int = [c1Str intValue];
int c2Int = [c2Str intValue];
NSLog(@"c1Str=%@; c2Str=%@; c1Int=%i; c2Int=%i", c1Str, c2Str, c1Int, c2Int);
//The output is
//c1Str=003; c2Str=004; c1Int=0; c2Int=4
したがって、c2Int は正常ですが、c1Int の場合は 0 (ゼロ) になります。私が使用した場合、まったく同じ結果が得られます:
NSArray *counterValues = [counter componentsSeparatedByString:@"{of}"];
int c1Int = [[counterValues objectAtIndex:0] intValue];
int c2Int = [[[counterValues objectAtIndex:1] intValue];
NSInputStream から読み取ったバイト バッファーからカウンターを取得します。*counter を @"003{of}004" として直接定義すると、正しく機能します。
なぜそうなのですか?intValue がゼロとして扱う *c1Str の特別な点は何ですか? どうすれば戦うことができますか?
ありがとう
編集: 質問は私にとってもう現実的ではありません。しかし、それは他の人にとって役立つかもしれません。設定された言葉で自分のタスクを理解して解決することができませんでした。ワークフローを再考し、変更する必要がありました。
問題の根源を詳しく説明したいと思います。ネットワーク経由で png ファイルを転送し、ios でデータを受信します。アイデアは、ファイルから読み取ったバイト配列を送信し、ファイルが来ることとカウンターが何であるかを通知するために先頭に特別なタグを付けることでした。
したがって、送信される構造は [6][003{of}004][ファイル データ パッケージ] のようになります。ここで、"[" と "]" の括弧は、構造を理解するためのものです。
前述したように、データは NSInputStream に送られ、[6] をキャッチでき、[003{of}004] をキャッチでき、残りのデータをキャッチできます。NSLog はそれを明確に示しています。しかし、カウンター文字列で何かが本当に奇妙です。文字列の先頭にある何かが奇妙だと思います。
まず第一に、部分文字列化してパーツを取得しようとすると、奇妙なインデックスを使用する必要があります。
intValue は、003 と 004 を取得するために使用するメソッドが何であれ、0 を返します。004 は常に期待どおりに正しく処理されます。
なぜこれが起こるのか(そして理想的には実用的な解決策)について誰かが説明できれば、それは間違いなく役に立ち、大いに感謝されます。
回答してくれたすべての人に感謝します。
PS私はこれを回避するために、カウンターを文字列として別々に送信し、最初に異なる通知タグを付けました。現在、カウンターの固定長は必要ないため、値はそのままの数値です: 3{of}4、または 121{of}784 など (先行ゼロなし)