Sha256: 7c2cc098e2069f61366a379e71b0dea4201e34f47452d90a2553d855de501942
Contents?: true
Size: 1.79 KB
Versions: 1
Compression:
Stored size: 1.79 KB
Contents
# frozen_string_literal: true # A simple stateful class for keeping track of a CRC32 value through multiple writes class ZipKit::StreamCRC32 include ZipKit::WriteShovel STRINGS_HAVE_CAPACITY_SUPPORT = begin String.new("", capacity: 1) true rescue ArgumentError false end CRC_BUF_SIZE = 1024 * 512 private_constant :STRINGS_HAVE_CAPACITY_SUPPORT, :CRC_BUF_SIZE # Compute a CRC32 value from an IO object. The object should respond to `read` and `eof?` # # @param io[IO] the IO to read the data from # @return [Integer] the computed CRC32 value def self.from_io(io) # If we can specify the string capacity upfront we will not have to resize # the string during operation. This saves time but is only available on # recent Ruby 2.x versions. blob = STRINGS_HAVE_CAPACITY_SUPPORT ? String.new("", capacity: CRC_BUF_SIZE) : +"" crc = new crc << io.read(CRC_BUF_SIZE, blob) until io.eof? crc.to_i end # Creates a new streaming CRC32 calculator def initialize @crc = Zlib.crc32 end # Append data to the CRC32. Updates the contained CRC32 value in place. # # @param blob[String] the string to compute the CRC32 from # @return [self] def <<(blob) @crc = Zlib.crc32(blob, @crc) self end # Returns the CRC32 value computed so far # # @return [Integer] the updated CRC32 value for all the blobs so far def to_i @crc end # Appends a known CRC32 value to the current one, and combines the # contained CRC32 value in-place. # # @param crc32[Integer] the CRC32 value to append # @param blob_size[Integer] the size of the daata the `crc32` is computed from # @return [Integer] the updated CRC32 value for all the blobs so far def append(crc32, blob_size) @crc = Zlib.crc32_combine(@crc, crc32, blob_size) end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
zip_kit-6.3.1 | lib/zip_kit/stream_crc32.rb |