C++/STL을 사용하여 바이너리 데이터를 저장하는 "올바른" 방법

StackOverflow https://stackoverflow.com/questions/441203

  •  22-07-2019
  •  | 
  •  

문제

일반적으로 C++에서 이진 데이터를 저장하는 가장 좋은 방법은 무엇입니까?내가 아는 한 옵션은 문자열이나 벡터<char> 사용으로 요약됩니다.(특히 C++를 언급하고 있으므로 char* 및 malloc()의 가능성은 생략하겠습니다).

일반적으로 나는 문자열을 사용하지만, 내가 놓친 오버헤드가 있는지 또는 STL이 내부적으로 수행하는 변환으로 인해 바이너리 데이터의 온전함이 손상될 수 있는지 잘 모르겠습니다.누구든지 이것에 대한 조언이 있습니까?어떤 식으로든 제안이나 선호 사항이 있나요?

도움이 되었습니까?

해결책

char의 벡터는 메모리가 연속되어 있기 때문에 좋습니다.따라서 버클리 소켓이나 파일 API와 같은 많은 C API와 함께 사용할 수 있습니다.예를 들어 다음을 수행할 수 있습니다.

  std::vector<char> vect;
  ...
  send(sock, &vect[0], vect.size());

그러면 잘 작동할 거예요.

기본적으로 동적으로 할당된 다른 char 버퍼와 마찬가지로 처리할 수 있습니다.위아래로 스캔하여 마법의 숫자나 패턴을 찾을 수 있습니다.부분적으로 구문 분석할 수 있습니다.소켓에서 수신할 경우 크기를 매우 쉽게 조정하여 더 많은 데이터를 추가할 수 있습니다.

단점은 크기 조정이 매우 효율적이지 않으며(신중하게 크기 조정 또는 사전 할당) 배열 전면에서 삭제하는 것도 매우 비효율적이라는 것입니다.예를 들어 데이터 구조 전면에서 한 번에 하나 또는 두 개의 문자만 매우 자주 표시해야 하는 경우 이 처리 전에 데크에 복사하는 것이 옵션일 수 있습니다.복사 비용이 들고 디큐 메모리는 연속적이지 않으므로 C API에 포인터를 전달할 수 없습니다.

요점은, 다이빙하기 전에 데이터 구조와 그 장단점에 대해 알아보십시오. 그러나 char 벡터는 일반적으로 일반적인 실습에서 사용되는 것입니다.

다른 팁

STD :: 문자열의 가장 큰 문제는 현재 표준이 기본 스토리지가 인접 해 있음을 보장하지 않는다는 것입니다. 그러나 문자열이 인접하지 않은 알려진 STL 구현은 없으므로 실제로는 실패하지 않을 것입니다. 실제로, 새로운 C ++ 0X 표준은 std :: string이 std :: vector와 같은 연속 버퍼를 사용하도록 의무화 함으로써이 문제를 해결할 것입니다.

문자열에 대한 또 다른 주장은 그 이름에 이름이 바이너리 버퍼가 아닌 문자열이 포함되어 있음을 시사한다는 것입니다.

즉, 벡터도 추천합니다.

나는 사용한다 std::string 이것에 대해서도 문제가 없었습니다.

어제 코드 조각에서 날카로운 알림을받은 "포인터"중 하나 : 이진 데이터 블록에서 문자열을 만들 때 std::string(startIter, endIter) 생성자 양식이 아닙니다 std::string(ptr, offset, length) 양식-후자는 포인터가 C 스타일 문자열을 가리키고 첫 번째 제로 문자 이후에 무엇이든 무시한다 (지정된 "까지 복사한다. length, 아니다 length 캐릭터).

당신은 확실히 숯의 컨테이너를 사용해야하지만 사용하려는 컨테이너는 응용 프로그램에 따라 다릅니다.

Chars에는 이진 데이터를 보유하는 데 유용한 몇 가지 속성이 있습니다. 표준은 Char 데이터 유형의 "패딩"을 해제합니다. 이는 이진 레이아웃에서 쓰레기를 얻지 못하기 때문에 중요합니다. 각 Char는 또한 정확히 하나의 바이트로 보장되므로 설정 너비가있는 유일한 일반 구식 데이터 유형 (POD)이됩니다 (다른 모든 것은 상한 및/또는 하한으로 지정됨).

Chars를 저장할 적절한 STL 용기에 대한 논의는 위의 Doug가 잘 처리합니다. 필요한 것은 전적으로 유스 케이스에 달려 있습니다. 특별한 조회, 추가/제거 또는 스플 라이스 요구없이 반복하는 데이터 블록을 보유하고 있다면 벡터를 선호합니다. 널리 터진 C 스타일 문자열을 보유합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top