"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Java와 Go는 왜 다른 GZIP 압축 출력을 생산하고 어떻게 동일하게 만들 수 있습니까?

Java와 Go는 왜 다른 GZIP 압축 출력을 생산하고 어떻게 동일하게 만들 수 있습니까?

2025-01-28에 게시됨
검색:601

Why Do Java and Go Produce Different GZip Compressed Outputs, and How Can I Make Them Identical?

데이터 유형 불일치

이 언어의 바이트. Java는 -128에서 127 사이의 서명 된 바이트를 사용하는 반면, Go는 0 ~ 255의 범위를 가진 부호없는 바이트 (UINT8)를 사용합니다.이 차이는 256을 추가하여 음의 Java 바이트 값의 변환이 필요합니다. 압축 수준 변동

바이트 값 조정을 사용 하더라도이 언어들 사이의 기본 압축 수준의 변화로 인해 다른 결과가 지속될 수 있습니다. Java와 Go Go는 처음에는 레벨 6 압축을 사용하지만이 값은 표준화되지 않았으며 구현이 이탈 할 수 있습니다.

Huffman Coding 및 LZ77

GZIP는 Huffman Coding을 사용합니다. 데이터를 압축하기위한 LZ77 알고리즘. 이러한 기술은 입력 문자 주파수에 의존하여 출력 코드를 할당하여 동일한 압축 수준에서도 출력 시퀀스의 분산 가능성을 도입합니다.

출력 차이를 제거하기 위해

동일을 얻습니다. 출력, 사용자는 Java와 Go에서 압축 레벨을 0 (압축 없음)으로 설정할 수 있습니다. Java에서는 def.setlevel (deflater.no_compression)을 설정하여 달성 할 수 있으며, 이동 중에는 gzip.newwriterlevel (& buf, gzip.nocompression)을 사용하는 것이 포함됩니다.

java byte 출력 변환

]

서명되지 않은 형식으로 Java Byte 값을 표시하려면 ByteValue & 0xff를 사용할 수 있습니다. 또는 16 진수 형태로 값을 표시하는 서명에 관한 우려를 주목합니다.

추가 고려 사항

gzip은 출력에 헤더 필드를 포함시킬 수 있습니다. Go는 gzip.header 유형을 통해 이러한 필드를 통합하고 Java는이 필드를 생략합니다. 정확한 출력을 생성하기 위해 사용자는 Apache Commons Compress와 같은 헤더 필드 조작을 가능하게하는 Java 용 타사 GZIP 라이브러리를 활용할 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3