NSDataオブジェクトを使用してロードしたバイナリファイルがあります。そのバイナリデータ内で文字列 'abcd'を検索し、ファイル全体を文字列に変換せずにオフセットを返す方法はありますか?それは簡単な答えでなければならないようですが、私はそれをどうやって行うのか分かりません。何か案は?バイナリデータで文字列を検索
私はiOS 3でこれをやっているので、-rangeOfData:options:range:
は利用できません。
私はstrstrを提案するためにこれをSixteen Ottoに与えます。私は行って、C関数strstrのソースコードを見つけて、固定長のバイト配列で動作するように書き直しました。これは、ヌル終了ではないため、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]];
offsetOfBytes:inBuffer:ofLengthのために投稿したコードは、データに実際にヌルが含まれている場合は問題が多くなります(元のstrstr()が残っています)。少なくとも、あなたはバイトの長さを渡す必要があります。なぜなら、この関数は、どれくらいの長さになっているのか分からないからです。 –
ねえ。フィードバックをお寄せいただきありがとうございます。 ofLength:パラメータのバイトの長さを渡しているので、何を意味するのか分かりません。ありがとう。 –
2バイトのポインタを渡していますが、長さは1つのみです。これは、あなたのコードが 'bytes'と' buffer'の両方の長さを知ることができないことを意味します。つまり、あなたの検索でそれらのどれかの終わりを逃げてしまう危険性があります。 –