Python vs Go zlib Output Discrepancies
In comparing the outputs of Python's and Go's zlib implementations, a noticeable difference arises when compressing the string "foo". The Python version returns an output with a fifth byte set to 0 while the Go version outputs a 4 in its place.
Compression Parameters
To understand this discrepancy, it's essential to examine the compression parameters used. The Go code employs flate.NewWriter, which generates a DEFLATE stream with a compression level of 7. The equivalent Python code initializes a zlib.compressobj utilizing the DEFLATED method and a compression level of -15.
Output Differences
The core difference lies in the byte output by each implementation. By default, Python zlib flushes the buffer after processing the input using zlib.Z_FLUSH. This corresponds to the Go implementation's zlib.Z_SYNC_FLUSH. However, in the Go code, calling Close() on the Writer object signifies the end of the stream and produces a complete zlib output.
Resolving the Discrepancy
To achieve the desired output from the Go code, Close() can be replaced with Flush(). This action emulates Python's behavior, flush the buffer and terminating the stream. Alternatively, to acquire the raw, complete DEFLATE stream from Python zlib, further investigation may be necessary as the default output format is zlib-formatted.
Implications
Comparing the outputs of different compression libraries is not a reliable approach. While the data should remain compatible, achieving byte-to-byte matches is challenging due to implementations-specific nuances.
The above is the detailed content of Why Do Python and Go\'s zlib Implementations Produce Differing Outputs for the Same String?. For more information, please follow other related articles on the PHP Chinese website!