Class: OpenC3::Crc
- Defined in:
- lib/openc3/utilities/crc.rb,
ext/openc3/ext/crc/crc.c
Overview
Constant Summary collapse
- BIT_REVERSE_TABLE =
[ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF ]
Instance Attribute Summary collapse
-
#poly ⇒ Integer
readonly
The polynomial used when calculating the CRC.
-
#reflect ⇒ Boolean
readonly
Whether to bit reverse each byte.
-
#seed ⇒ Integer
readonly
Seed value used to start the calculation.
-
#table ⇒ String
readonly
Binary lookup table used to perform the calculation.
-
#xor ⇒ Boolean
readonly
Whether the result is XORed with 0xFFFF.
Instance Method Summary collapse
- #bit_reverse_16(value) ⇒ Object
- #bit_reverse_32(value) ⇒ Object
- #bit_reverse_64(value) ⇒ Object
-
#bit_reverse_8(value) ⇒ Integer
Bit reverse the 8 bit value.
-
#calc(data, seed = @seed) ⇒ Integer
Calculates the CRC across the data buffer using the optional seed.
-
#initialize(poly, seed, xor, reflect) ⇒ Crc
constructor
Creates a CRC algorithm instance.
Constructor Details
#initialize(poly, seed, xor, reflect) ⇒ Crc
Creates a CRC algorithm instance.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/openc3/utilities/crc.rb', line 61 def initialize(poly, seed, xor, reflect) @poly = poly @seed = seed @xor = xor @reflect = reflect if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT'] @table = '' else @table = [] end # Determine which class we're using: Crc8, Crc16, Crc32, Crc64 case self.class.name when 'OpenC3::Crc8' @bit_size = 8 pack = 'C' filter_mask = 0xFF right_shift = 0 when 'OpenC3::Crc16' @bit_size = 16 pack = 'S' filter_mask = 0xFFFF right_shift = 8 when 'OpenC3::Crc32' @bit_size = 32 pack = 'I' filter_mask = 0xFFFFFFFF right_shift = 24 when 'OpenC3::Crc64' @bit_size = 64 pack = 'Q' filter_mask = 0xFFFFFFFFFFFFFFFF right_shift = 56 end if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT'] (0..255).each do |index| @table << [compute_table_entry(index, @bit_size)].pack(pack) end else (0..255).each do |index| @table << (compute_table_entry(index, @bit_size) & filter_mask) end @filter_mask = filter_mask @right_shift = right_shift @bit_reverse = method("bit_reverse_#{@bit_size}") # A reflected (least-significant-bit first) table avoids reversing each # input byte in calc. CRC32 and CRC64 get three additional tables so # their common reflected forms can process four bytes per Ruby loop. if @reflect reflected_table = Array.new(256) do |index| @bit_reverse.call(@table[BIT_REVERSE_TABLE[index]]) end @reflected_tables = [reflected_table] if @bit_size >= 32 3.times do previous_table = @reflected_tables[-1] @reflected_tables << Array.new(256) do |index| value = previous_table[index] (value >> 8) ^ reflected_table[value & 0xFF] end end end end end end |
Instance Attribute Details
#poly ⇒ Integer (readonly)
Returns The polynomial used when calculating the CRC.
44 45 46 |
# File 'lib/openc3/utilities/crc.rb', line 44 def poly @poly end |
#reflect ⇒ Boolean (readonly)
Returns Whether to bit reverse each byte.
50 51 52 |
# File 'lib/openc3/utilities/crc.rb', line 50 def reflect @reflect end |
#seed ⇒ Integer (readonly)
Returns Seed value used to start the calculation.
46 47 48 |
# File 'lib/openc3/utilities/crc.rb', line 46 def seed @seed end |
#table ⇒ String (readonly)
Returns Binary lookup table used to perform the calculation.
52 53 54 |
# File 'lib/openc3/utilities/crc.rb', line 52 def table @table end |
#xor ⇒ Boolean (readonly)
Returns Whether the result is XORed with 0xFFFF.
48 49 50 |
# File 'lib/openc3/utilities/crc.rb', line 48 def xor @xor end |
Instance Method Details
#bit_reverse_16(value) ⇒ Object
145 146 147 148 |
# File 'lib/openc3/utilities/crc.rb', line 145 def bit_reverse_16(value) (BIT_REVERSE_TABLE[value & 0xFF] << 8) | (BIT_REVERSE_TABLE[(value >> 8) & 0xFF]) end |
#bit_reverse_32(value) ⇒ Object
150 151 152 153 154 155 |
# File 'lib/openc3/utilities/crc.rb', line 150 def bit_reverse_32(value) (BIT_REVERSE_TABLE[value & 0xFF] << 24) | (BIT_REVERSE_TABLE[(value >> 8) & 0xFF] << 16) | (BIT_REVERSE_TABLE[(value >> 16) & 0xFF] << 8) | (BIT_REVERSE_TABLE[(value >> 24) & 0xFF]) end |
#bit_reverse_64(value) ⇒ Object
157 158 159 160 161 162 163 164 165 166 |
# File 'lib/openc3/utilities/crc.rb', line 157 def bit_reverse_64(value) (BIT_REVERSE_TABLE[value & 0x00000000000000FF] << 56) | (BIT_REVERSE_TABLE[(value >> 8) & 0x00000000000000FF] << 48) | (BIT_REVERSE_TABLE[(value >> 16) & 0x00000000000000FF] << 40) | (BIT_REVERSE_TABLE[(value >> 24) & 0x00000000000000FF] << 32) | (BIT_REVERSE_TABLE[(value >> 32) & 0x00000000000000FF] << 24) | (BIT_REVERSE_TABLE[(value >> 40) & 0x00000000000000FF] << 16) | (BIT_REVERSE_TABLE[(value >> 48) & 0x00000000000000FF] << 8) | (BIT_REVERSE_TABLE[(value >> 56) & 0x00000000000000FF]) end |
#bit_reverse_8(value) ⇒ Integer
Bit reverse the 8 bit value
141 142 143 |
# File 'lib/openc3/utilities/crc.rb', line 141 def bit_reverse_8(value) BIT_REVERSE_TABLE[value & 0xFF] end |
#calc(data, seed = @seed) ⇒ Integer
Calculates the CRC across the data buffer using the optional seed. Implemented in C for speed.
|
|
# File 'lib/openc3/utilities/crc.rb', line 129
|