2012-05-24 2 views
1

는 1000 바이트, 압축 ZLIB 및 회전 (800 ~ 900 바이트)를 전송자바 데이터 스트림 압축 해제

Inflater decompresser = new Inflater(); 
decompresser.setInput(buffer.toString().getBytes()); 
byte[] dataBytes = new byte[8388608]; 
int resultLength = decompresser.inflate(dataBytes); 
decompresser.end(); 
System.out.println("decompressed" + new String(dataBytes, 0, resultLength)+ " RESULTLENGHT " +resultLength); 

하지만 나도 몰라 (버퍼)

BufferedReader is = new BufferedReader(new InputStreamReader(download.getInputStream())); 

데이터 압축 해제 소켓에서 데이터를 얻을 수 정확히 송신 크기. 한 번에 소켓 1 바이트에서 읽어야하고 압축 해제 된 데이터의 전체 크기가 1000 바이트가 될 때까지 즉시 압축을 풀어야합니다.

StringBuilder buffer = new StringBuilder(); 
StringBuilder unpackbuffer = new StringBuilder(); 
do buffer.append((char)is.read()); 
while(buffer.charAt(buffer.length()-1) != '|' && (byte)buffer.charAt(buffer.length()-1) != -1); 

가 어떻게이주기 unpackbuffer를 입력 않습니다

내가 그렇게 한 번에 바이트를 읽으려면? 크기를 확인 하시겠습니까? 죄송합니다, 제 질문은 분명히 바랍니다.

답변

1

좋아요, 전송할 데이터에 길이를 추가 한 다음 다른 쪽 끝에서 읽을 수없는 경우 (이렇게 허용하도록 프로토콜을 설계 할 수 있다면 가장 이상적인 해결책 일 것입니다) , '바이트 단위로'스트림을 압축 할 수 있습니다. 트릭은 입력 버퍼로 1 바이트 버퍼를 만드는 것입니다.

Inflater infl = new Inflater(); 
    byte[] buf = new byte[1]; 
    byte[] outputBuf = new byte[512]; 
    while (!infl.finished()) { 
     while (infl.needsInput()) { 
      buf[0] = ...next byte from stream... 
      infl.setInput(buf); 
     } 
     int noUnc = infl.inflate(outputBuf); 
     // the first "noUnc" bytes of outputBuf contain the next bit of data 
    } 
+0

불행하게도, 프로토콜이 당신이 바이트를 팩 코드하고 압축을 풉니 다 코드 모두를, 이해가 작성되지 않는 – Dmitriy

+0

를 제공하지 않습니다 다음과 같이 코드는 보인다? 원하는 바이트를 추가 할 수 없습니까? –

+0

아니요, NMDC 프로토콜 용 클라이언트를 작성 중이며 전체 시스템을 제어 할 수 없습니다. Java 용 스트리밍을 압축 해제하는 방법이 있습니까? – Dmitriy

관련 문제