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 |