Sha256: 6fe871d7cd72c2296e9ad803f0ffe1daa87fcec66d48d9af7f3fd2a774577e31

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

require 'USPS-intelligent-barcode/NumericConversions'

module Imb

  # @!group Internal

  # Calculates the Intelligent Mail Barcode CRC.

  class Crc

    extend NumericConversions

    # Calculate a CRC.
    # @param [Integer] binary_data A 102-bit integer
    # @return [Integer] An 11-bit CRC

    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

1 entries across 1 versions & 1 rubygems

Version Path
USPS-intelligent-barcode-0.2.3 lib/USPS-intelligent-barcode/Crc.rb