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.
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 |
# File 'lib/openc3/utilities/crc.rb', line 66 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 when 'OpenC3::Crc16' @bit_size = 16 pack = 'S' filter_mask = 0xFFFF when 'OpenC3::Crc32' @bit_size = 32 pack = 'I' filter_mask = 0xFFFFFFFF when 'OpenC3::Crc64' @bit_size = 64 pack = 'Q' filter_mask = 0xFFFFFFFFFFFFFFFF 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 end end |
Instance Attribute Details
#poly ⇒ Integer (readonly)
Returns The polynomial used when calculating the CRC.
49 50 51 |
# File 'lib/openc3/utilities/crc.rb', line 49 def poly @poly end |
#reflect ⇒ Boolean (readonly)
Returns Whether to bit reverse each byte.
55 56 57 |
# File 'lib/openc3/utilities/crc.rb', line 55 def reflect @reflect end |
#seed ⇒ Integer (readonly)
Returns Seed value used to start the calculation.
51 52 53 |
# File 'lib/openc3/utilities/crc.rb', line 51 def seed @seed end |
#table ⇒ String (readonly)
Returns Binary lookup table used to perform the calculation.
57 58 59 |
# File 'lib/openc3/utilities/crc.rb', line 57 def table @table end |
#xor ⇒ Boolean (readonly)
Returns Whether the result is XORed with 0xFFFF.
53 54 55 |
# File 'lib/openc3/utilities/crc.rb', line 53 def xor @xor end |
Instance Method Details
#bit_reverse_16(value) ⇒ Object
123 124 125 126 |
# File 'lib/openc3/utilities/crc.rb', line 123 def bit_reverse_16(value) (BIT_REVERSE_TABLE[value & 0xFF] << 8) | (BIT_REVERSE_TABLE[(value >> 8) & 0xFF]) end |
#bit_reverse_32(value) ⇒ Object
128 129 130 131 132 133 |
# File 'lib/openc3/utilities/crc.rb', line 128 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
135 136 137 138 139 140 141 142 143 144 |
# File 'lib/openc3/utilities/crc.rb', line 135 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
119 120 121 |
# File 'lib/openc3/utilities/crc.rb', line 119 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 107
|