class Zip::ExtraField::Zip64
Info-ZIP Extra for Zip64 size
def ==(other)
def ==(other) other.original_size == @original_size && other.compressed_size == @compressed_size && other.relative_header_offset == @relative_header_offset && other.disk_start_number == @disk_start_number end
def extract(size, format)
def extract(size, format) @content.slice!(0, size).unpack1(format) end
def initialize(binstr = nil)
def initialize(binstr = nil) # unparsed binary; we don't actually know what this contains # without looking for FFs in the associated file header # call parse after initializing with a binary string @content = nil @original_size = nil @compressed_size = nil @relative_header_offset = nil @disk_start_number = nil binstr && merge(binstr) end
def merge(binstr)
def merge(binstr) return if binstr.empty? _, @content = initial_parse(binstr) end
def pack_for_c_dir
def pack_for_c_dir # central directory entries contain only fields that didn't fit in the main entry part packed = ''.force_encoding('BINARY') packed << [@original_size].pack('Q<') if @original_size packed << [@compressed_size].pack('Q<') if @compressed_size packed << [@relative_header_offset].pack('Q<') if @relative_header_offset packed << [@disk_start_number].pack('V') if @disk_start_number packed end
def pack_for_local
def pack_for_local # local header entries must contain original size and compressed size; other fields do not apply return '' unless @original_size && @compressed_size [@original_size, @compressed_size].pack('Q<Q<') end
def parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil)
wider values are only present in the extra field for base values set to all FFs
pass the values from the base entry (if applicable)
def parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil) @original_size = extract(8, 'Q<') if original_size == 0xFFFFFFFF @compressed_size = extract(8, 'Q<') if compressed_size == 0xFFFFFFFF @relative_header_offset = extract(8, 'Q<') if relative_header_offset && relative_header_offset == 0xFFFFFFFF @disk_start_number = extract(4, 'V') if disk_start_number && disk_start_number == 0xFFFF @content = nil [@original_size || original_size, @compressed_size || compressed_size, @relative_header_offset || relative_header_offset, @disk_start_number || disk_start_number] end