2011-11-28 2 views
3

파일에 ASCII 코드로 작성된 번호가 있습니다. 예를 들어, "9"는 2 바이트, 즉 총 8 비트로 저장된다.숫자를 이진 파일로 저장하십시오.

숫자를 0-9 사이의 이진 값으로 저장하는 것만으로 저장소를 최적화하려는 경우 4 비트 만 사용하여 저장해야합니다.

어떤 도움이 필요합니까?!

+0

"9"가 "57"로 저장된다는 것을 의미합니까? 나는 ascii 57이 2 바이트를 어떻게 사용할 수 있는지를 볼 수 없다. – gigadot

+0

예 char "9"는 파일 하나에 2 바이트로 저장되며 하나는 5이고 다른 하나는 7입니다. –

+0

여기 알고리즘에 버그가있을 수 있습니다. 파일 압축에 Zip 라이브러리를 사용할 수 없습니까? Zip 또는 보관 라이브러리에는 자신이 올 수있는 알고리즘보다 훨씬 정교한 알고리즘이 있습니다. – gigadot

답변

1

당신은 그들에게 그

import java.io.ByteArrayInputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 


public class Bin { 
    public static void main(String[] args) throws IOException { 
     FileOutputStream fos = new FileOutputStream("\\test.bin"); 
     String digits="12345"; 
     char[] chars = digits.toCharArray(); 
     for (int i = 0 ; i < chars.length ; i+= 2) { 
      byte b1 = (byte) (chars[i] - (byte) '0'); 
      byte b2 = (byte) (i < chars.length-1 ? chars[i+1] - (byte) '0' : 0xf); 
      fos.write((byte) ((b1 << 4) | b2)); 
     } 
     fos.close(); 
     FileInputStream fis = new FileInputStream("\\test.bin"); 
     StringBuffer result = new StringBuffer(); 
     byte[] buf = new byte[100]; 
     int read = fis.read(buf); 
     ByteArrayInputStream bais = new ByteArrayInputStream(buf); 
     for (int i = 0 ; i < read ; i++) { 
      byte both = (byte) bais.read(); 
      byte b1 = (byte) ((both >> 4) & 0xf); 
      byte b2 = (byte) (both & 0xf) ; 
      result.append(Character.forDigit(b1, 10)); 
      if (b2 != 0xf) { 
       result.append(Character.forDigit(b2,10)); 
      } 
     } 
     System.out.println(result.toString()); 
    } 
} 

같은 바이너리를 쓸 수 있었다 그러나 나는이

+0

좋아요! 남자 그냥 내게 말해 어떻게 내 문자를 다시 읽고 문자열에 저장할 수 있습니다. 우리가 –

+0

@shaklasah로 시작한 문자열은 내가 생각한 것보다 더 힘들었습니다. 소스 문자열이 홀수 인 경우 0xf를 적어 둡니다. 완성 된 바이트 만 쓸 수 있기 때문에 패딩으로 사용됩니다. – stacker

+0

내 친구에게 고마워하지만, 여전히 문제가 있다고 생각합니다. 98765 인코딩 시도 .. –

1

어떨까요? 2 => 0010 1 => 0001 0 => 0000 4 => 0100 3 => 0011 8 => 1,000 9 => 1,001 7 => 0111 6 => 0110 5 => 0101

+0

예, 파일에 이것을 쓰려면 어떻게해야합니까?! –

+0

파일 출력 스트림을 사용하여 파일 – nidhin

+0

에 쓸 수는 있지만 각 숫자를 다시 2 바이트로 처리하므로 0000이 8 바이트로 간주되므로 더 심각해질 것입니다. S –

1

내가 표준을 고수 할 매우 유용 할 것이라는 점을 의심은 기본 형식을 휴대용 형식으로 출력에 쓸 수 있습니다.

writeLong, writeInt입니다. 이 방법을 사용하면 데이터를 쓸 수 있으며 나중에 DataInputStreamreadLongreadInt으로로드 할 수 있습니다.

압축되지 않은 압축 파일은 나중에 압축 할 수 있습니다.

0

문자를 쓰면 각 문자마다 1 바이트가 필요합니다. 바이너리 또는 부울 데이터를 써야합니다. 5 => 0101을 표현할 수 있지만 0101을 문자로 쓰면 4 바이트가 걸리며 이진 ​​또는 부울을 쓰면 비트가됩니다.