2011-12-27 2 views
2

모든 실제 압축 파일 데이터를 삽입 한 후 압축 된 파일에 호프만 트리를 쓰려고합니다. 그러나, 나는 약간의 문제를 깨달았습니다. 실제로 모든 실제 데이터가 파일에 기록되면 2 줄 넘김 문자를 입력하고 트리를 작성한다고 결정했다고 가정 해보십시오. 즉, 내가 물건을 다시 읽을 때, 그 두 개의 라인 피드 (또는 모든 문자) 내 구분 기호입니다. 문제는, 실제 데이터에도 차례대로 두 개의 라인 피드가 있다는 전적으로 가능하다는 것입니다. 이러한 시나리오에서는 구분 기호 검사가 실패합니다. 여기에 두 개의 줄 바꿈을 예로 들었지만 모든 문자열에 대해서도 마찬가지입니다. 더 긴 문자열을 구분 기호로 사용하여 문제를 피할 수는 있지만 두 가지 바람직하지 않은 영향을줍니다. 1. 있습니다. 여전히 긴 문자열이 압축 된 데이터에있는 우연한 일치에 의한 것일 수도 있습니다. 2. 압축 할 필요가있는 파일을 필요 없게 압축합니다.압축 후 파일에 호프만 트리 쓰기

누군가 트리 데이터에서 압축 된 데이터를 분리하는 방법에 대한 제안 사항이 있습니까?

답변

3

먼저 트리의 크기를 바이트로 씁니다. 그런 다음 트리 자체를 작성한 다음 내용 자체를 작성하십시오.

읽을 때 처음에는 크기를 읽은 다음 트리 (읽어야 할 문자 수를 알 수 있음)를 입력 한 다음 내용을 읽습니다.

크기는 줄 바꿈으로 끝나는 문자열로 쓰여질 수 있습니다.이 방법으로 첫 번째 숫자와 줄 바꿈은 트리의 크기에 속한다는 것을 알고 있습니다.

+0

처음에는 그렇게 생각했는데 문제는 트리가 커질 수 있다는 것입니다. 그래서 Integer를 작성해야합니다. 바로 4 바이트입니다. 그리고 문자열로 쓰면 거기에 넣은 각 정수에 대해 1 바이트를 사용합니다. 한 번에 2 또는 3 비트를 절약하여 물건을 압축하려고하는 프로그램에는별로 효율적이지 않습니다. – angryInsomniac

+0

나무가 얼마나 클 것이라고 기대하십니까? 몇 킬로바이트입니까? – Giorgio

+0

@angryInsomniac 올바른 조건에서'size (tree) + size (compressed_data)'가'size (original_data)'보다 클 수 있습니다. 알파벳이 작고 데이터가 거대한 경우 (균등하게 분포되지 않은 경우) 분명히 의미가 있습니다. 의사 소통에 필요한 최소한의 비트 (사전을 고려할 때)에 관심이 있다면 의사 소통의 복잡성이라는 이론적 컴퓨터 과학 (개방형) 이론이 있습니다. – user1071136

0

크기와 len을 처음 8 바이트 (각각 4 바이트)로 쓰고 그 다음 데이터를 쓰지 않는 이유는 무엇입니까? 다음과 같이하십시오 :

uint32_t compressed_size; 
uint32_t data_len; 
char * data; 

file.read((char*)compressed_size, 4); 
file.read((char*)data_len, 4); 
data = new char[data_len]; 
zip.read(data, data_len); 

작동해야합니다. 더 나은 압축을 위해 데이터를 압축 할 수 있습니다.