의 strstr()에 두 개의 byte[]
이 있는데 첫 번째 byte[]
(또는 그 범위)에 두 번째 byte[]
의 첫 번째 항목을 찾고 싶습니다.strstr() C#
효율성을 위해 문자열을 사용하고 싶지 않습니다. 첫 번째 byte[]
을 string
로 변환하는 것이 비효율적입니다.
strstr()
이
그 (그래서 효율적이고 사용하기 쉽게) 할 수있는 가장 좋은 방법은 무엇입니까 C.
에 무엇을 믿을?이는 같이하는 방법입니다 :
int GetOffsetOfArrayInArray(byte[] bigArray, int bigArrayOffset, int bigArrayCount, byte[] smallArray);
감사합니다!
UPDATE :
나는 간단한 검색보다 더 효율적으로 할 수있는 솔루션을 원한다. 즉, 버퍼를 더 효율적으로 비교할 수 있다는 사실을 사용하면 - memcmp()가 바이트을 반복하는 것보다 효율적입니다.
- 큰 배열 : 또한
, 나는이 같은 시나리오를 최적화 알고리즘이 알고 "12312351231234"
- 작은 배열 : "1231234" 이
- 순진한 알고리즘 : 7 비교 "1231235"가 "1231234"와 다르다는 것을 알아 내고, 2는 다음 "1"을 찾기 위해 비교하고, 4는 "1235"가 "1231"과 다르다는 것을 알아 내고, 3은 다음 "1"을 찾는 것을 비교하고, 7은 일치하는 것을 찾는다. 총 7 + 2 + 4 + 3 + 7 = 23이 비교됩니다.
- 스마트 알고리즘 : 7 "1231234"가 "1231234"와 다른 경우 "비교하지 않고"다음 "1"로 바로 이동하고, 4는 "1235"가 "1231" , "5"를 넘어 직접 점프, 7 경기를 비교합니다. 총 7 + 4 + 7 = 18이 비교됩니다.
먼저 변환 코드를 작성한 다음 프로파일 링하십시오. 성능 병목 현상이있는 것으로 판단되면 변환을하지 않도록 최적화하십시오. 수표를 함수 호출로 감싸서 나중에 구현을 대체해야 할 경우 간단하게 구현할 수 있습니다. –
memcmp()는 strstr()에 대한 대안이 아닌 * *입니다. 표준 CRT에는 찾고있는 기능이 없습니다. 모든 버전의 Windows에서 사용할 수있는 msvcrt.dll에서 strstr()을 pinvoke 할 수 있습니다. 그러나 0을 포함하는 바이트 []를 허용하지 않습니다. –
"memcmp()는 단어 크기 비교를 수행하거나 하드웨어의 특수 기능을 사용하기 위해 표지 아래 구현 된 경우에만 바이트를 반복하는 것보다 효율적입니다. 입력 버퍼가 다른 정렬에서 시작하는 memcmp를 최적화하려고 시도하는 것은 꽤 ... 피팅입니다. –