Compreendendo a diferença nas saídas Golang e Python Zlib
Ao compactar uma string usando a compactação Zlib, a biblioteca zlib do Python produz uma saída diferente em comparação com Implementação zlib de Golang. Especificamente, o quinto byte é diferente, com Python tendo um valor de 0, enquanto Golang tem um valor de 4.
Causa da diferença
A disparidade nas saídas decorre dos diferentes mecanismos de liberação usados pelas bibliotecas Python e Go. O zlib do Python é padronizado como Z_FLUSH, que libera o buffer após compactar cada bloco de dados. Por outro lado, a biblioteca flate de Golang, que implementa Zlib, usa Z_SYNC_FLUSH por padrão. Esse comportamento libera os dados depois que todo o fluxo de entrada foi processado.
Como obter a mesma saída em Golang
Para obter a mesma saída do zlib do Python, substitua Close() com Flush() no código Go:
func compress(source string) []byte {
buf := new(bytes.Buffer)
w, _ := flate.NewWriter(buf, 7)
w.Write([]byte(source))
w.Flush()
return buf.Bytes()
}
Bytes vs. Stream completo
É importante observar que a saída do exemplo Python não é um stream completo. Ele apenas libera o buffer após compactar a primeira string.
Limitações da correspondência byte a byte
Comparando a saída byte a byte de diferentes bibliotecas de compactação combinar dados compactados geralmente não é viável ou prático. A saída produzida pelas bibliotecas de compactação é garantidamente compatível, não idêntica.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3