2016-09-24 7 views
3

나는 호프만 자바 응용 프로그램을 작성 중이며 거의 완료되었습니다. 나는 한 가지 문제가있다. 나는 "101011101010"과 같은 문자열을 파일에 저장해야한다. 현재 코드로 저장하면 0 또는 1마다 1 바이트를 차지하는 문자로 저장됩니다. 모든 0/1을 조금 저장할 수 있다는 것이 확실합니다.0과 1의 문자열을 파일로 비트로

BitSet 및 Integer.valueOf를 사용하여 몇 가지 시도를 이미했지만 작동하도록 할 수 없습니다. 이것은 현재 코드입니다 :

FileOutputStream fos = new FileOutputStream("encoded.bin"); 
fos.write(encoded.getBytes()); 
fos.close(); 

여기서 'encoded'는 "0101011101"과 같을 수있는 문자열입니다. 정수로 저장하려고하면 선행 0이 제거됩니다.

미리 감사드립니다.

EDIT : Huffman은 압축 방법이므로 가능한 한 작게 출력해야합니다.

+0

왜 문자열을 정수로 변환 하시겠습니까? 선행 0이없는 문자열을 저장할 수있는 경우 선행 0으로 문자열을 저장할 수 있습니까? 당신의 문제는 정확히 무엇입니까? – Pat

+0

그럼 압축 방법입니다. 따라서 'a'또는 'b'는 0110 (4 비트이고 1 바이트가 아님)으로 변환됩니다. 문제는 1과 0을 1 바이트로 저장하므로 압축이 없다는 것입니다 (더 악화되었습니다). –

답변

2

내 대답을 찾은 것 같습니다. 그 후

BitSet bitSet = new BitSet(encoded.length()); 
int bitcounter = 0; 
for(Character c : encoded.toCharArray()) { 
    if(c.equals('1')) { 
     bitSet.set(bitcounter); 
    } 
    bitcounter++; 
} 

나는 내가 BitSet.valueOf(bitSet.toByteArray())를 사용하여 비트 세트로 다시 변환 다시 읽고 싶은 경우 bitSet.toByteArray() 사용하여 파일에 저장 : 나는 다음과 같은 코드를 사용하여 비트 세트에 1과 0을 넣어. 그런 다음 비트 세트를 반복합니다.

String binaryString = ""; 
for(int i = 0; i <= set.length(); i++) { 
    if(set.get(i)) { 
     binaryString += "1"; 
    } else { 
     binaryString += "0"; 
    } 
} 

나를 도운 모든 사람들에게 감사드립니다.

0

바이너리 파일은 8의 배수로 비트를 저장하는 것으로 제한됩니다. 당신의 비트 문자열의 길이를 나누어

  • 계산 바이트 배열의 길이 : 당신은, 8 비트 덩어리로 문자열을 자르고 Byte.parseByte(eightCharString, 2)를 사용하여 바이트로 변환하고 바이트 배열에 추가하여이 문제를 해결할 수 여덟
  • 하여 원하는 길이
  • 실행 여덟
  • 파싱 각 청크의 배수를 나타내는 위치에서 열로부터 문자열을 얻어 루프의 바이트 배열을 할당하고, 해당 바이트로 결과를 넣어
  • 로 전화 바이트 배열의
+0

"각 청크를 구문 분석하고 그 결과를 해당 바이트에 넣습니다." 그것은 0을 제거하기 때문에 Integer.parseInt를 사용할 수 없습니다. Byte.parseByte (s, 2)를 시도 할 때 서명되지 않았기 때문에 작동하지 않습니다. –

+0

@ 루드 뱅크 울렌 어떤 예외가 있습니까? 그건 그렇고, 만약'int' 파싱이 잘 작동한다면'int' 결과를'byte'로 형변환 할 수 있습니다. – dasblinkenlight

+0

'java.lang.NumberFormatException : 값이 범위를 벗어났습니다.값 : "11101101"기수 : 10 '1111111을 사용할 수 없으므로 특정 값보다 높은 값을 받아들이지 않으므로 그 값을 읽습니다. –

0

이것을 시도하십시오.

String encoded = "0101011101"; 
FileOutputStream fos = new FileOutputStream("encoded.bin"); 
String s = encoded + "00000000".substring(encoded.length() % 8); 
for (int i = 0, len = s.length(); i < len; i += 8) 
    fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2)); 
fos.close(); 
+0

내가 잘못하지 않는다면 BinaryString의 10 진수 값을 얻을 수 있을까요? 저장하는 동안 작동하지만 읽으려고하면 모든 선행 제로가 제거됩니다. 예를 들면 : Integer.parseInt ("00001111", 2)'는 15를 반환합니다. Integer.toBinaryString (15)를 실행하려고하면 1111을 반환합니다. –

+0

'String s = "처럼해야합니다. 00000000 "+ Integer.toBinaryString (15); 그리고'문자열 디코딩 = s.substring (s.length() - 8);' – saka1029

관련 문제