Class: OpenC3::Crc

Inherits:
Object show all
Defined in:
lib/openc3/utilities/crc.rb,
ext/openc3/ext/crc/crc.c

Overview

Abstract base class which Crc16, Crc32 and Crc64 use. Do NOT use this class directly but instead use one of the subclasses.

Direct Known Subclasses

Crc16, Crc32, Crc64, Crc8

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

Instance Method Summary collapse

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

#polyInteger (readonly)



49
50
51
# File 'lib/openc3/utilities/crc.rb', line 49

def poly
  @poly
end

#reflectBoolean (readonly)



55
56
57
# File 'lib/openc3/utilities/crc.rb', line 55

def reflect
  @reflect
end

#seedInteger (readonly)



51
52
53
# File 'lib/openc3/utilities/crc.rb', line 51

def seed
  @seed
end

#tableString (readonly)



57
58
59
# File 'lib/openc3/utilities/crc.rb', line 57

def table
  @table
end

#xorBoolean (readonly)



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