"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Python과 Golang Zlib가 서로 다른 압축 출력을 생성하는 이유는 무엇입니까?

Python과 Golang Zlib가 서로 다른 압축 출력을 생성하는 이유는 무엇입니까?

2024-11-08에 게시됨
검색:896

Why Do Python and Golang Zlib Produce Different Compressed Outputs?

Golang과 Python Zlib 출력의 차이점 이해

Zlib 압축을 사용하여 문자열을 압축할 때 Python의 zlib 라이브러리는 다음과 비교하여 다른 출력을 생성합니다. Golang의 zlib 구현. 구체적으로 다섯 번째 바이트는 다릅니다. Python의 값은 0이고 Golang의 값은 4입니다.

차이의 원인

출력의 차이는 Python 및 Go 라이브러리에서 사용되는 다양한 플러시 메커니즘에서. Python의 zlib의 기본값은 Z_FLUSH로, 이는 각 데이터 블록을 압축한 후 버퍼를 플러시합니다. 대조적으로, Zlib를 구현하는 Golang의 flate 라이브러리는 기본적으로 Z_SYNC_FLUSH를 사용합니다. 이 동작은 전체 입력 스트림이 처리된 후 데이터를 플러시합니다.

Golang에서 동일한 출력을 얻는 방법

Python의 zlib와 동일한 출력을 얻으려면 다음을 바꾸십시오. Go 코드에서 Flush()를 사용하여 Close():

func compress(source string) []byte {
    buf := new(bytes.Buffer)
    w, _ := flate.NewWriter(buf, 7)
    w.Write([]byte(source))
    w.Flush()

    return buf.Bytes()
}

바이트 대 전체 스트림

Python 예제의 출력이 완전한 스트림이 아니라는 점에 유의하는 것이 중요합니다. 첫 번째 문자열을 압축한 후에만 버퍼를 플러시합니다.

바이트 간 일치의 제한

다른 압축 라이브러리의 바이트 간 출력을 다음과 비교합니다. 압축된 데이터와 일치하는 것은 일반적으로 실현 가능하지 않거나 실용적이지 않습니다. 압축 라이브러리에서 생성된 출력은 동일하지 않고 호환 가능함을 보장합니다.

최신 튜토리얼 더>

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

Copyright© 2022 湘ICP备2022001581号-3