2011-10-18 3 views
0

나는 루트에서 리프로 트리를 가로 지르고 기호가 나타나는 횟수에 따라 # = 000011이라는 인코딩 예제를 얻는 우선 순위 큐를 사용하여 Java에서 허프만 인코딩 알고리즘을 구현했습니다 입력에. 모든 것이 잘되고, 나무가 잘 짜여지고 인코딩은 예상대로 진행됩니다. 그러나 출력 파일은 원래 파일보다 더 커집니다. 나는 현재 '0'을 &에 추가하고 있습니다. '1'은 트리의 왼쪽 노드와 오른쪽 노드를 가로 지르는 문자열입니다. 아마 내가 끝내는 것은 각 문자마다 8 비트를 모두 사용하기 때문에 압축에 도움이되지 않습니다. 필자는이 비트를 필요한 문자 값으로 변환하는 것으로 추측하고 있습니다. 그래서 이러한 문자는 8 비트보다 적은 비트를 사용하므로 원래 파일의 압축 된 버전을 얻습니다. Java에서 문자를 조작하고 비트를 줄임으로써 압축을 수행하는 방법을 알려주십시오. 감사합니다허프만 인코딩 중 Java에서 파일을 압축 할 수 없습니다.

답변

0

"0"또는 "1"또는 단순히 + 연산자를 추가하여 문자열 끝에 "0"또는 "1"을 연결하는 것은 아마도 StringBuilder를 사용하고있을 것입니다. 아니면 어떤 종류의 OutputStream을 사용하고 있습니다.

실제 비트를 쓰고 싶습니다. 내가 쓰기 전에 전체 바이트를 먼저 만들 것을 제안한다. 바이트는 다음과 같습니다 이진 문자열 0000 0011을 나타내는 것

0x05 

합니다.

당신은 byte 유형을 추가하고 이동하여 다음을 할 수 있습니다 :

물론
public void writeToFile(String binaryString, OutputStream os){ 
    int pos = 0; 
    while(pos < binaryString.length()){ 
     byte nextByte = 0x00; 
     for(int i=0;i<8 && pos+i < binaryString.length(); i++){ 
      nextByte << 1; 
      nextByte += binaryString.charAt(pos+i)=='0'?0x0:0x1; 
     } 
     os.write(nextByte); 
     pos+=8; 
    } 
} 

, 한 번에 한 바이트를 작성하는 비효율적이고, 그 꼭대기에서의 OutputStream 인터페이스는 바이트 배열을 받아 (byte[]). 따라서 배열에 바이트를 저장하는 것이 더 쉬울 것입니다 (또는 더 쉽게는 List). 그런 다음 더 큰 청크로 작성하는 것이 좋습니다.

바이트 쓰기를 사용할 수없는 경우 (왜 ObjectOutputStream이 바이트 배열 쓰기를 지원합니까?), Base64를 사용하여 이진 문자열을 인코딩 할 수 있습니다. 그러나 Base64는 데이터 사용량을 33 % 늘려줍니다.

바이트 배열을 base64로 쉽게 변환하는 방법은 기존의 인코더를 사용하는 것입니다. 당신은 인코더를 인스턴스화하고 문자열로 바이트 배열을 설정할 수 있습니다

import sun.misc.BASE64Encoder; 

: 다음 import 추가 한 후

byte[] bytes = getBytesFromHuffmanEncoding(); 
BASE64Encoder encoder = new BASE64Encoder(); 
String encodedString = encoder.encode(bytes); 
+0

당신이 바로, 내가 연결할 수있는 + 연산자를 사용하고 있습니다를 '0'또는 ' 1 '을 문자열 끝에 추가합니다. 하지만 당신이 제안한 Ascii 32 비트 형식의 파일에 출력을 쓰려면 문자열 "Str"을 사용해야합니다 (실제 비트를 쓰는 대신). 이걸 얻을 수 있을까요? 코드는 ObjectOutputStream입니다. ObjOutputStream = new ObjectOutputStream (new FileOutputStream (EncFile)); \t \t ObjOutputStream.writeObject (Str); – PC2015

+0

아마 내가 얻은 모든 바이트를 char로 변환하여 String Str에 저장할 수 있습니까? – PC2015

+0

@ user997509 Base64의 기능과 거의 같습니다. 바이너리를 문자열로 매핑하지만 최적이 아니며 사용하는 모든 바이트에 대해 6 비트 만 인코딩 할 수 있으므로 결과 파일이 팽창합니다. 그러나 ASCII 문자열 만 사용하는 것이 가장 좋습니다. – bdares

관련 문제