2011-12-10 5 views
0
내가 허프만 algotrithm에게

허프만 알고리즘 어셈블리

내가 writen 있고,이 버퍼 크기보다 작은 charachters이 파일에 대한 좋은 작품을 사용하여 TXT 파일을 압축/압축 해제하는 프로그램을 작성해야하지만 대한 작업을 나던

더 많은 문자를 가진 파일.

제 문제는 압축 버퍼와 압축 해제 버퍼를 연결하는 것입니다.

따라서 압축을 통해 작성된 바이트 수 (트리를 통과하는 1과 0 포함)가 압축 해제가 읽는 바이트 수와 다른 경우 작동하지 않습니다. 예를 들어 압축 버퍼가 200을 쓰는 경우 정확히 200 바이트를 읽으려면 압축 해제 버퍼가 필요합니다. 내가 200을 읽어 압축 해제의 크기를 설정하면

, 어딘가에 압축 (200)를 작성하고 다른 시간 작거나 이상 200

당신은 압축에 의해 쓰여진 바이트의 수를 추적하는 방법을 무엇을 제안 할 수 매번 압축 해제 부분으로 전송 하시겠습니까?

+0

며칠 전 동일한 프로그램을 만들었습니다. 문제가있는 곳을 조금 더 설명해 주시겠습니까? – MrD

+0

물론 압축을 위해서 파일을 읽으려면 inbuffer (4000bytes)를 사용하고, 파일을 읽은 후에는 –

+0

을 사용하여 주파수 테이블을 만듭니다. 그것을 출력에 씁니다. 나무를 만드십시오. 닫고 각 문자에 대한 경로를 얻으려면 입력 파일을 다시 열려면 출력 파일에 경로를 (0 위로 1 아래로) 쓰기 3000 바이트 버퍼를 사용하십시오. 0 또는 1이 8 비트 버퍼로 이동 된 후에 비트가 기록됩니다. 하지만 일부 비트는 쓰레기입니다. 그래서 나는 그 수를 유지합니다. 버퍼의 첫 번째 문자로 출력에 기록합니다.이 문자는 압축 해제에서 다시 읽습니다. 그러나 문제는 압축의 출력 버퍼가 항상 압축 해제 버퍼의 크기 인 –

답변

1

일반적인 방법은 "트랙"스트림의 마지막에이 사용을 위해 특별히 N + 1 "EOF"기호를 추가하는 것입니다 수 있습니다. 이렇게하면 "크기"카운터를 유지할 필요가 없습니다.

0

나는 어떤 버퍼도 사용하지 않았다. 내 파일의 헤더에 코드 길이와 코드 자체를 기록합니다. 그래서 파일 압축을 풀고 싶을 때 먼저 헤더의 코드 길이와 코드를 읽습니다. 헤더의 몇 바이트를 파일의 정확성을 검사하기 위해 넣을 수 있습니다 (예 : XXY). 파일이이 바이트로 시작하지 않으면 파일이 손상됩니다). 코드 길이와 코드를 읽은 후에는 나머지 데이터를 디코딩 할 차례입니다. 이 방법으로 그것을 해독 할 수

int data=0,dataLength=0; 
while (input.read((char*)&sign, sizeof sign)) {  
    data = (data << 8) + sign; 
    dataLength += 8; 
    for (int i=0; i<256; i++) { 
     if (dataLengthFromHeader[i]==0) 
      continue; 
     if (dataLength>=dataLengthFromHeader[i] && codesFromHeader[i] == data >> (dataLength-dataLengthFromHeader[i])) { 
      unsigned char code = i; 
      izlaz.write((char*)&code, sizeof code); 
      dataLength -= dataLengthFromHeader[i]; 
      data = data - (codesFromHeader[i] << dataLength); 
      if (dataLength==0) break; 
       i=0; 
     } 
    } 
} 
+0

많이 고맙지 만 어셈블리에서 필요합니다. 출력 파일이 모두 동일하면 알 수 없습니다 –

+0

컴파일러를 사용하여 어셈블리로 변환합니다 – hirschhornsalz

관련 문제