NSData 객체를 사용하여로드 한 이진 파일이 있습니다. 바이너리 데이터 내에서 'abcd'문자 시퀀스를 찾고 전체 파일을 문자열로 변환하지 않고 오프셋을 반환하는 방법이 있습니까? 그것은 단순한 대답이어야하는 것처럼 보입니다, 그러나 나는 그것을하는 방법을 모르겠습니다. 어떤 아이디어?이진 데이터에서 문자 문자열 찾기
iOS 3에서이 작업을 수행하므로 -rangeOfData:options:range:
을 사용할 수 없습니다.
저는 strstr을 제안하기 위해 이것을 16 Otto에게 수여 할 것입니다. 나는 C 함수 strstr에 대한 소스 코드를 찾아 고정 길이의 바이트 배열에서 작업하도록 다시 작성했다. 이것은 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]];
offsetOfBytes : inBuffer : ofLength :에 대해 게시 한 코드에는 데이터에 실제로 null이 포함될 수있는 경우 많은 문제가 발생합니다 (원래 strstr()이 너무 많음). 최소한이 함수는 얼마나 길어야할지 모르기 때문에 바이트 길이를 전달해야합니다. –
안녕하세요. 의견을 보내 주셔서 감사합니다. ofLength : 매개 변수의 바이트에 대한 길이를 전달하므로 어떤 의미인지 확실하지 않습니다. 감사. –
2 바이트 포인터로 전달되지만 한 길이 만 전달합니다. 이것은 여러분의 코드가'bytes'와'buffer'가 얼마나 오래 있는지를 알 수 없다는 것을 의미합니다. 즉, 여러분이 검색에서 그들 중 하나의 끝에서 벗어날 위험이 있음을 의미합니다. –