我有一个使用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