我有一個使用NSData對象加載的二進制文件。有沒有辦法在二進制數據中找到一系列字符'abcd',並返回偏移量而不將整個文件轉換爲字符串?似乎它應該是一個簡單的答案,但我不知道該怎麼做。有任何想法嗎?在二進制數據中查找字符串
我在iOS 3上這樣做,所以我沒有-rangeOfData:options:range:
可用。
我打算把這一個獎勵給Sixteen Otto來建議strstr。我去了,並找到了C函數strstr的源代碼,並將其重寫爲在一個固定長度的Byte數組上工作 - 偶爾與char數組不同,因爲它不是null結尾。這裏是我結束了代碼:
- (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]];
如果您的數據確實可以包含空值(原始strstr()左側太多),您爲offsetOfBytes發佈的代碼:inBuffer:ofLength:將會遇到很多問題。至少,你需要傳遞字節的長度,因爲這個函數不知道應該有多長時間。 – 2009-12-03 15:42:50
嘿。感謝您的反饋。我在ofLength:參數中傳入字節的長度,所以我不確定你的意思。謝謝。 – 2009-12-03 16:15:49
你傳遞了兩個字節的指針,但只有一個長度。這意味着你的代碼不可能知道'bytes'和'buffer'有多長,這意味着你有可能在你的搜索中結束其中一個。 – 2009-12-03 18:07:28