나는 루트에서 리프로 트리를 가로 지르고 기호가 나타나는 횟수에 따라 # = 000011이라는 인코딩 예제를 얻는 우선 순위 큐를 사용하여 Java에서 허프만 인코딩 알고리즘을 구현했습니다 입력에. 모든 것이 잘되고, 나무가 잘 짜여지고 인코딩은 예상대로 진행됩니다. 그러나 출력 파일은 원래 파일보다 더 커집니다. 나는 현재 '0'을 &에 추가하고 있습니다. '1'은 트리의 왼쪽 노드와 오른쪽 노드를 가로 지르는 문자열입니다. 아마 내가 끝내는 것은 각 문자마다 8 비트를 모두 사용하기 때문에 압축에 도움이되지 않습니다. 필자는이 비트를 필요한 문자 값으로 변환하는 것으로 추측하고 있습니다. 그래서 이러한 문자는 8 비트보다 적은 비트를 사용하므로 원래 파일의 압축 된 버전을 얻습니다. Java에서 문자를 조작하고 비트를 줄임으로써 압축을 수행하는 방법을 알려주십시오. 감사합니다허프만 인코딩 중 Java에서 파일을 압축 할 수 없습니다.
0
A
답변
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'또는 ' 1 '을 문자열 끝에 추가합니다. 하지만 당신이 제안한 Ascii 32 비트 형식의 파일에 출력을 쓰려면 문자열 "Str"을 사용해야합니다 (실제 비트를 쓰는 대신). 이걸 얻을 수 있을까요? 코드는 ObjectOutputStream입니다. ObjOutputStream = new ObjectOutputStream (new FileOutputStream (EncFile)); \t \t ObjOutputStream.writeObject (Str); – PC2015
아마 내가 얻은 모든 바이트를 char로 변환하여 String Str에 저장할 수 있습니까? – PC2015
@ user997509 Base64의 기능과 거의 같습니다. 바이너리를 문자열로 매핑하지만 최적이 아니며 사용하는 모든 바이트에 대해 6 비트 만 인코딩 할 수 있으므로 결과 파일이 팽창합니다. 그러나 ASCII 문자열 만 사용하는 것이 가장 좋습니다. – bdares