gpt4 book ai didi

ios - 在二进制数据中查找字符串

转载 作者:可可西里 更新时间:2023-11-01 03:06:32 27 4
gpt4 key购买 nike

我有一个使用 NSData 对象加载的二进制文件。有没有办法在该二进制数据中定位字符序列(例如“abcd”)并返回偏移量而不将整个文件转换为字符串?似乎这应该是一个简单的答案,但我不确定该怎么做。有什么想法吗?

我在 iOS 3 上执行此操作,所以我没有可用的 -rangeOfData:options:range:

我要把这个奖励给 Sixteen Otto,因为他推荐了 strstr。我找到了 C 函数 strstr 的源代码并将其重写为在固定长度的 Byte 数组上工作——顺便说一句,它与 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]];

最佳答案

将您的子字符串转换为 NSData 对象,并使用 rangeOfData:options:range: 在较大的 NSData 中搜索这些字节.确保字符串编码匹配!

在 iPhone 上,如果它不可用,您可能必须自己执行此操作。 C 函数 strstr() 将为您提供指向缓冲区中第一次出现的模式的指针(只要两者都不包含空值!),但不是索引。这是应该完成这项工作的函数(但没有 promise ,因为我还没有尝试实际运行它......):

- (NSUInteger)indexOfData:(NSData*)needle inData:(NSData*)haystack
{
const void* needleBytes = [needle bytes];
const void* haystackBytes = [haystack bytes];

// walk the length of the buffer, looking for a byte that matches the start
// of the pattern; we can skip (|needle|-1) bytes at the end, since we can't
// have a match that's shorter than needle itself
for (NSUInteger i=0; i < [haystack length]-[needle length]+1; i++)
{
// walk needle's bytes while they still match the bytes of haystack
// starting at i; if we walk off the end of needle, we found a match
NSUInteger j=0;
while (j < [needle length] && needleBytes[j] == haystackBytes[i+j])
{
j++;
}
if (j == [needle length])
{
return i;
}
}
return NSNotFound;
}

它的运行时间类似于 O(nm),其中 n 是缓冲区长度,m 是子字符串的大小。它是为与 NSData 一起工作而编写的,原因有两个:1) 这就是您手头似乎拥有的东西,以及 2) 这些对象已经封装了实际字节和缓冲区的长度。

关于ios - 在二进制数据中查找字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1834787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com