2012-03-21 4 views
0

나는 다음과 같은 멤버로 간단한 Person 클래스를 썼다 :는 C의 표준 : : 문자열을 인코딩 ++

std::string _fname; 
std::string _lname; 
int _age; 

내가 멤버 변수로 vector<Person> _contacts 나중에에 AddressBook 클래스를 작성 할 계획입니다. 지금은 AddressBook을 직렬화하는 것이 바이너리 모드로 열리는 파일의 별도 라인에 각 연락처의 인코딩 된 버전을 작성하는 것이라고 결정했습니다. 기본적으로이 문자열을 따라 값을 얻기 위해 나중에 구문 분석 할 문자열입니다. "John~Doe~42"

Person 클래스에 많은 새 멤버 변수가 있으면이 문자열을 인코딩하려고합니다. 꽤 길어. 나는 그것이 16 진수 표현으로 인코딩 될 수 있기를 희망했지만 매우 어려울 것 같아서, std::string을 인 코드 할 수있는 다른 방법이 있습니까?

+0

[Boost.Serialization] (http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html) 및 [Boost.Iostreams] (http : //www.boost .org/doc/libs/1_49_0/libs/iostreams/doc/index.html)이 가장 좋습니다. –

답변

4

나는 인간을 인간으로

하여 비 해독 할 수 있도록하는 표준 : : 문자열을 인코딩하는 다른 방법이있다, 그러나이 문자열을 인코딩합니다. 어떤 인간?

  • "내 바보 형제"
  • "내 코가 있지만, 스마트 엄마"
  • "A 경쟁 회사"
  • "정부"

    는 개인적으로 나는 그들을 분류합니다.

암호화는 사람을 이길 :

  • 형제 ('N'각 캐릭터에 추가)
  • 어머니 (디코딩하는 'N'빼기) : (XOR 키)
  • 회사 : 실제 암호화 패키지 (예 : SHA-512)가 부족합니다.
  • 정부 : 그렇지요.
    그들이 나에게서 뭔가를 얻고 싶다면 나는 기회가 없다.
    그래서 저는 그것을 처리 할 전문 회사를 고용합니다.

는 지금, 나는 주소록 바이너리 모드로 열 것이다 파일에서 별도의 행에 각 연락처의 인코딩 된 버전을 작성하는 것입니다 직렬화 것이라고 결정했다.

바이너리/텍스트 모드 실제 차이점이 없습니다. 이진 모드는 '\ n'이 End of Line Sequence으로 /에서 변환되지 않는다는 것을 의미합니다. ''

은 물론 "존 ~ 미상 ~ 42",하지만 난 사용합니다 :

그것은 기본적으로 나는 곳이 라인을 따라, 값을 얻기 위해 나중에 분석 할 수 있습니다 문자열을 수 있습니다 (공백)을 구분 기호로 사용합니다 (스트림 라이브러리가 이미 기본 seporator로 사용함). 이렇게하면 코드를 작성하기가 훨씬 쉬워집니다.앞에서 언급 한 문자열은 고정 길이 문자열이없는 한 해당 길이로 인코딩해야합니다.

내 Person 클래스에 많은 새 멤버 변수가 있으면이 문자열이 상당히 길어질 수 있기 때문입니다.

추가 정보를 인코딩하려면 버전 필드를 추가하십시오. 따라서 버전 번호를 먼저 읽으면 다른 필드가 다음에 무엇을 기대하는지 알려줍니다.

나는 16 진수 표현

이 이해가되지 않는 인코딩 할 수 있다고 기대했다.
모든 것은 숫자입니다.

작지 않은 경우?

물론 압축 할 수 있습니다.
압축 알고리즘을 찾으십시오.

+0

@rcplusplus : 당신을 위해 explictly 한 철자법을 사용합니다. 당신이 진짜 프로젝트를 위해 필요하다고 가정합니다. 위의 대답에서 지적한 SHA-X와 같은 암호화 알고리즘을 사용해야합니다. –

+0

@LokiAstari 각 문자의 ASCII 값을 가져와 16 진수로 변환하는 것이 합리적일까요? 예를 들어, "cat"은 "63 61 74"가됩니다. 나는 공백을 제거 할 것이기 때문에 실제로는 다음과 같이 보일 것이다 : "0x636174". – rcplusplus

+0

@ 메모리에 'c'값이 이미 '0x63'이라는 숫자로 저장되어 있다는 것을 알고 있습니까? 'c'는 0x63의 동의어입니다. 아니면 문자열 "cat"을 문자열 "636174"로 변환한다는 의미입니까? 그건 내 형제가 아니고 내 엄마는 안돼. –

0

XOR을 시도하거나 ASCII 값을 추가하여 문자를 오프셋 할 수 있습니다. 'a'를 'r', 'b'를 's'로 변환하십시오. 이 방법은 매우 강하지는 않지만 사람들은 그것을보고 직접 읽을 수 없습니다. 하지만 사회 보장 번호, 신용 카드 번호 등 심각한 문제가있는 경우 더 심각한 것을 사용하고 더 조심해야합니다.

0

XML을 파일 형식으로 사용하면 더 편리 할 것입니다. 이렇게하면 버전 2의 Person 클래스에 선택적인 "중간 이름"을 추가하기로 결정한 경우 주소록 내용을 코드의 이전 버전과 최신 버전과의 사이에서 앞뒤로 호환 할 수 있습니다.

XML로 데이터를 직렬화 한 다음 승리를 위해 압축하십시오. 대부분 무료이며 소스를 포함하는 좋은 압축 라이브러리가 많이 있습니다. zlib이 잘 작동합니다.

보고 싶은 도서관은 Boost Serialization입니다.

많은 XML 라이브러리도 있습니다. 그것을위한 빙.

+0

XML은 사람이 읽을 수 있을까? – rcplusplus

+0

위의 제안대로 zlib로 압축 한 후 아닙니다. – selbie

1

sqlite은 어떻게 사용하나요? 데이터를 직렬화 할 필요가 없다는 등의 방법으로 바이너리 파일을 만들고 일반 데이터베이스로 액세스 할 수 있습니다.

장기적으로 모든 것을 다시 작성할 필요없이 다른 데이터베이스에 연결하여 응용 프로그램을 확장 할 수 있습니다.

Here 멋진 인트로를 찾을 수 있습니다.