2012-08-05 2 views
1

잠시 동안 패킷 상태를 저장해야합니다. 그래서 서명되지 않은 char *로 표현 된 패킷 데이터를 읽었습니다.이 데이터로 레코드를 만들고 잠시 동안 레코드를 목록에 저장합니다.unsigned char *를 unsigned char *로 복사하십시오.

레코드의 패킷을 char * 또는 char []로 표현하는 더 좋은 방법이 될 것입니다.

어떻게 두 옵션에 읽은 데이터 (서명 숯불 )을 복사 않습니다 서명 숯불 []와 서명 숯불에 *

내가 읽을 때마다 의지를 패킷 때문에 데이터를 복사해야

같은 char *로 읽으므로 데이터를 먼저 복사해야합니다.

+2

'char []'은 완전한 타입이 아니므로 질문에 의미가 없습니다. –

+0

* packet *의 정의는 무엇입니까? 최대 크기를 알고 있습니까? 패킷 내용을 처리해야합니까? –

답변

10

패킷 데이터 내가 C strXXX 기능 중 하나는 반대로, 데이터를 저장하는 std::vector를 사용하여 원합니다 잠재적 NULL 문자가 기존의 문제를 방지하기 위해 진 경우 데이터 스트림. 대부분 strXXX 함수는 NULL 문자를 찾고 해당 문자를 잘라냅니다. 데이터가 문자열이 아니기 때문에이 작업을 위해 std::string을 피할 수도 있습니다.

std::vector<unsigned char> v(buf, buf + datalen); 

벡터 생성자 buf[datalen - 1]buf[0]에 모든 데이터를 복사하며 벡터가 범위를 벗어나면, 메모리의 할당을 해제한다. v.data() 또는 &v[0]을 사용하여 기본 버퍼에 대한 포인터를 가져올 수 있습니다.

+8

아, C++을 아는 사람. –

+1

개인적으로 ** 어떤 상황에서도 C++에서'strXXX' 함수를 사용하지 않을 것을 제안합니다. (몇 군데 있지만 여전히있을 수 있습니다.) – Grizzly

+0

내 목록은 레코드 목록입니다. 레코드의 필드 중 하나가이 char 배열입니다. –

-3

그래서 미래의 어느 시점까지 여러 패킷의 데이터를 목록에 저장해야하는 것처럼 들립니다.

나라면 std :: string 또는 std :: vector를 사용했는데 이는 할당 문제를 제거하고 일반적으로 충분히 빠르기 때문입니다.

char * 또는 char []을 사용하려는 경우 char *를 사용하고 싶습니다. "char buf [1024];"와 같은 변수를 선언합니다. 스택에 할당합니다. 즉, 함수가 반환 할 때 스택이 사라집니다. 목록에 저장하려면 동적으로 할당해야하므로 "char * buf = new char [packet.size];" 그런 다음 데이터를 복사하고 포인터와 데이터의 길이를 목록에 저장하십시오 (또는 이전에 말씀 드렸듯이, 길이를 별도로 유지하는 것을 피하는 std :: string을 사용하십시오).

데이터를 어떻게 복사합니까?

아마도 memcpy. strcpy 함수는 nul 문자를 가질 수있는 데이터에 문제가있어 네트워킹 상황에서 흔히 발생합니다. 그래서, 뭔가 같은 :

char *buf = new char[packet_length]; 
memcpy(buf, packet_data, packet_length); 
// Put buf and packet_length into a structure in your list. 
+0

아니요 아니요 아니요. 수동으로 메모리를 관리하는 대신'std :: vector'를 사용하십시오. –

+0

나는 std :: string을 제안했다. (std :: vector는 괜찮지 만). 포스터가 물었던 것이기 때문에 char *에 대한 정보를 포함했습니다. – cds

관련 문제