당신의 질문은 명확하지 않지만, 많은 사람들이 버퍼 작동 방식을 오해하고있는 것을 보았습니다. 그래서 제가 도울 수 있다고 생각합니다.
당신이 말하는 바에 따르면, 데이터를 버퍼로 읽을 것으로 예상되며 부분적으로 검색 문자열과 일치 할까 우려됩니다. 그런 다음 나머지 부분을 읽으면 첫 번째 많은 데이터를 덮어 씁니다.
이렇게하면 데이터 처리 방법이 달라집니다. 매번 같은 부분의 메모리를 읽을 필요가 없습니다. 버퍼의 요점은 당신이 채울 수있는 공간을 제공하고 필요하다면 뒤섞어 버리고 버릴 수 있다는 것입니다.
버퍼를 효과적으로 사용하는 방법에는 여러 가지가 있습니다.
버퍼를 읽을 때 마지막 바이트의 위치를 알 수 있도록 색인을 유지 관리합니다 (tail
이라고 부름). 가장 효율적인 방법은 다음과 같습니다. N
바이트까지 읽을 수 있습니다. 여기서 N
은 버퍼 크기입니다. 데이터 처리와 관련하여 바이트 수를 tail
까지 확인할 수 있습니다.
이미 처리 한 항목을 추적하려면 head
색인을 유지하십시오. 더 많은 데이터를 읽어야한다고 결정한 후에는 head
과 tail
사이의 모든 것을 가져 와서 버퍼의 처음으로 이동하십시오 (memmove
, 이 아닌memcpy
사용). head = 0
및 tail = tail-head
을 설정합니다. 이제 최대 N - tail
바이트를 읽을 수 있습니다. 당연히 버퍼의 위치는 tail
색인 뒤에 시작됩니다.
전체 일치 문자열을 연속 바이트로 테스트 할 수있는 경우 가장 쉬운 버퍼링 방식입니다.
더 나아가려면 데이터를 전혀 옮길 필요가 없다는 것을 깨닫기 위해 많은 상상력을 필요로하지 않습니다. 당신은 head
체이스 tail
주위를 돌아 다닐 수 있습니다. 이것은 반지 (또는 원형) 버퍼라고합니다. 이것의 어려움은 일반적인 문자열 매칭을 사용할 수 없다는 것입니다. 그러나 자신의 롤링을 많이하지는 않습니다.
희망이 있으면 도움이됩니다.
"모든 데이터"라고 말할 방법이 없습니다 ... 제 경우에는 매 1 초마다 데이터 블록을 보내는 GPS입니다. –
@Leandro : 다른 스레드에 데이터를 전송 한 다음이 스레드에서 문자열을 검색하도록 할 수 있습니까? –
Nops, 그 임베디드 코드, 더 많은 스레드를 가질 수 없습니다 ... –