2014-09-30 2 views
0

PHP에서 처음 압축 된 Java의 json 객체의 압축을 푸는 중입니다. 여기가 PHP로 압축됩니다 방법은 다음과 같습니다Java에서 PHP의 gzcompress 압축 해제

function zip_json_encode(&$arr) { 
    $uncompressed = json_encode($arr); 
    return pack('L', strlen($uncompressed)).gzcompress($uncompressed); 
} 

와 (다시 PHP에서) 디코딩 : 자바하여 DB에서 MySQL을 투입됩니다 지금이 당겨해야

function unzip_json_decode(&$data) { 
    $uncompressed = @gzuncompress(substr($data,4)); 
    return json_decode($uncompressed, $array_instead_of_object); 
} 

. 우리는이 같은 ResultSet에서 잡아 당깁니다 :

String field = rs.getString("field"); 

나는 다음 압축을 해제하는 방법에 해당 문자열을 전달합니다. 이것은 그것이 붕괴되는 곳입니다.

private String decompressHistory(String historyString) throws SQLException { 
    StringBuffer buffer = new StringBuffer(); 
    try { 
     byte[] historyBytes = historyString.substring(4).getBytes(); 
     ByteArrayInputStream bin = new ByteArrayInputStream(historyBytes); 
     InflaterInputStream in = new InflaterInputStream(bin, new Inflater(true)); 
     int len; 
     byte[] buf = new byte[1024]; 
     while ((len = in.read(buf)) != -1) { 
      // buf should be decoded, right? 
     } 

    } catch (IOException e) { 
     e.getStackTrace(); 
    } 
    return buffer.toString(); 

} 

여기에 무슨 문제가 있는지 잘 모르겠지만 어떤 포인터라도 감사 할 것입니다.

답변

1

trueInflater(true)에서 제거해야합니다. 단지 Inflater() 만 사용하십시오. true은 원시 수축 데이터를 예상합니다. true이 없으면 zlib-wrapped deflate 데이터가 필요합니다. PHP의 gzcompress()은 zlib-wrapped deflate 데이터를 생성합니다.

1

Gzipped 데이터는 2 진수, 바이트 []입니다. 유니 코드 텍스트 인 String을 사용하면 변환이 필요할뿐만 아니라 오류가 발생합니다.

은 예를 들어이 전환을 포함한다 :

byte[] historyBytes = historyString.substring(4).getBytes(); 
byte[] historyBytes = historyString.substring(4).getBytes("ISO-8859-1"); 

최초 버전이 애플리케이션이 비 - 휴대용 만드는 기본 플랫폼 인코딩을 사용한다.

첫 번째해야 할 일은 VARBINARY 또는 BLOB로 데이터베이스의 이진 데이터를 사용하는 것입니다.

ImputStream field = rs.getBinaryStream("field"); 
try (InputStream in = new GZIPInputStream(field)) { 
    ... 
} 

등. 다른 대답을 생각해보십시오.

0

결국 위의 해결 방법 중 어느 것도 효과가 없지만 둘 다 장점이 있습니다. mysql에서 데이터를 꺼내서 바이트로 캐스팅 할 때 누락 된 문자 바이트가 여러 개 있습니다 (67). 이것은 자바 측에서 압축을 풀지 못하게 만들었습니다. 위의 답변을 참조하십시오. Mark는 gzcompress()가 zlib을 사용하므로 Java에서 Inflater() 클래스를 사용해야합니다.

데이터 변환에 오류가있는 것이 맞습니다. 우리 테이블이 너무 커서 varbinary 또는 blob로 변환 할 수 없습니다. 그 수 있습니다 문제를 해결했지만 우리를 위해 작동하지 않았다. 우리는 자바가 PHP 애플리케이션에 대한 요청을 한 다음, 단순히 PHP 쪽에서 압축 된 데이터를 풀었다. 이것은 잘 돌아갔다. 다행스럽게도이 문제는 다른 사람에게 도움이됩니다.

관련 문제