# frozen_string_literal: true module Ssz # @example: # ByteBuffer.from_bit_array([1, 0, 0, 0]).bytes #=> "\x01" class ByteBuffer attr_accessor :bytes def initialize(n = 0) @bytes = [0] * n end def self.from_bit_array(bits) byte_size = bits.size < 8 ? 1 : (bits.size / 8.0).ceil bb = ByteBuffer.new(byte_size) bb.bits = bits bb end def bits=(bits) byte_size = bits.size < 8 ? 1 : (bits.size / 8.0).ceil # fill 0 to fix byte(8-bits) while (byte_size * 8) != bits.size do bits << 0 end bits.each_with_index do |b, i| @bytes[i / 8] |= b << (i % 8) end bits end def serialize @bytes.pack("C*") end def length @bytes.length end def bit_size length * 8 end end end