Sha256: 361a816c46e6e3f31fa7a3e5b8c0301031c30535127f8a900eb920d98b4e59b0
Contents?: true
Size: 1.21 KB
Versions: 1
Compression:
Stored size: 1.21 KB
Contents
require 'usps_intelligent_barcode/numeric_conversions' module Imb # @!group Internal # Calculates the Intelligent Mail Barcode CRC. # # See spec. section 9.1 ("CRC Generating Code") class Crc include NumericConversions # Calculate a CRC. # @param binary_data [Integer] A 102-bit integer # @return [Integer] An 11-bit CRC def 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 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 def 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-1.0.0 | lib/usps_intelligent_barcode/crc.rb |