Sha256: 028a0e20fce1f0ad03b55030b694f27106928d25a47f7eb2bf885e418754b14c

Contents?: true

Size: 1.16 KB

Versions: 2

Compression:

Stored size: 1.16 KB

Contents

require 'USPS-intelligent-barcode/NumericConversions'

module Imb

  # Calculates the Intelligent Mail Barcode CRC.  This class is
  # internal and may change.

  class Crc

    extend NumericConversions

    # Calculate a CRC.  +binary_data+ on an Integer.

    def self.crc(binary_data)
      crc = MASK
      bytes = numeric_to_bytes(binary_data, NUM_INPUT_BYTES)
      crc = crc_byte(crc, bytes.first, LEADING_BITS_TO_IGNORE)
      for byte in bytes[1...NUM_INPUT_BYTES]
        crc = crc_byte(crc, byte, 0)
      end
      crc
    end

    private

    # :stopdoc:

    LEADING_BITS_TO_IGNORE = 2
    CRC_BITS = 11
    CRC_MSB_MASK = 1 << (CRC_BITS - 1)
    BITS_PER_BYTE = 8
    POLYNOMIAL = 0x0F35
    MASK = (1 << CRC_BITS) - 1
    NUM_INPUT_BYTES = 13

    # :startdoc:

    def self.crc_byte(crc, byte, leading_bits_to_ignore)
      num_bits = BITS_PER_BYTE - leading_bits_to_ignore
      data = byte << CRC_BITS - BITS_PER_BYTE + leading_bits_to_ignore
      num_bits.times do
        use_polynomial = (crc ^ data) & CRC_MSB_MASK
        crc <<= 1 
        crc ^= POLYNOMIAL if use_polynomial != 0
        crc &= MASK
        data <<= 1
      end
      crc
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
USPS-intelligent-barcode-0.2.2 lib/USPS-intelligent-barcode/Crc.rb
USPS-intelligent-barcode-0.2.1 lib/USPS-intelligent-barcode/Crc.rb