NSDataオブジェクトを使用してロードしたバイナリファイルがあります。そのバイナリデータ内で文字のシーケンス、たとえば「abcd」を見つけて、ファイル全体を文字列に変換せずにオフセットを返す方法はありますか?簡単な答えのようですが、どうすればいいのかわかりません。何か案は?
私はiOS3でこれを行っているので、利用できません-rangeOfData:options:range:
。
strstrを提案してくれたSixteenOttoにこれを授与します。私は行って、C関数strstrのソースコードを見つけ、固定長のByte配列で動作するように書き直しました。これは、nullで終了しないため、char配列とは異なります。これが私が最終的に得たコードです:
- (Byte*)offsetOfBytes:(Byte*)bytes inBuffer:(const Byte*)buffer ofLength:(int)len;
{
Byte *cp = bytes;
Byte *s1, *s2;
if ( !*buffer )
return bytes;
int i = 0;
for (i=0; i < len; ++i)
{
s1 = cp;
s2 = (Byte*)buffer;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return cp;
cp++;
}
return NULL;
}
これは、最初に出現するバイトへのポインタを返します。これは、バッファ内で、バイトを含む必要のあるバイト配列を探しています。
私はそれをこのように呼びます:
// data is the NSData object
const Byte *bytes = [data bytes];
Byte* index = [self offsetOfBytes:tag inBuffer:bytes ofLength:[data length]];