crc 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/HISTORY.ja.md +13 -0
- data/README.md +39 -26
- data/benchmark.rb +18 -3
- data/gemstub.rb +5 -5
- data/lib/crc.rb +205 -95
- data/lib/crc/_byruby.rb +26 -18
- data/lib/crc/_combine.rb +104 -0
- data/lib/crc/_modules.rb +114 -98
- data/lib/crc/finder.rb +7 -3
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ccf4d480da684a319f684082517b687ec6bd9974
|
4
|
+
data.tar.gz: c97ed329ce7093405e7db797ede21ff6f8d9acbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c026e783622209e7fd9ff23783a773a6da6c2514f685c177ade3225b560b9c2db5ebe126e6bedbe98e7a039c24d0974ae73139bf623d771fc47f07cb04b39ce
|
7
|
+
data.tar.gz: a4b27b3b7262c4c46e616048d587c3ae9b809dd104d7e76686f611f830c9f761eccbef0a693cf46acede424205a1984247b351e7f9ef78442fc800489577a68d
|
data/HISTORY.ja.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
This document is written in Japanese.
|
2
|
+
|
3
|
+
# crc for ruby の更新履歴
|
4
|
+
|
5
|
+
## crc-0.2 (平成28年5月15日 (日))
|
6
|
+
|
7
|
+
* CRC モジュールの追加と修正
|
8
|
+
* CRC::Utils.build\_table、CRC::Utils.build\_reflect\_table メソッドに slice キーワード引数を導入
|
9
|
+
* CRC::Generator#combine、CRC::BasicCRC#+ メソッドの実装
|
10
|
+
|
11
|
+
## crc-0.1 (平成28年5月8日 (日))
|
12
|
+
|
13
|
+
初版
|
data/README.md
CHANGED
@@ -3,46 +3,53 @@
|
|
3
3
|
|
4
4
|
This is a general CRC (Cyclic Redundancy Check) generator for ruby.
|
5
5
|
|
6
|
-
It is written by pure ruby with based on slice-by-eight algorithm (byte-order
|
6
|
+
It is written by pure ruby with based on slice-by-eight algorithm (slice-by-16 algorithm as byte-order free and byte-alignment free).
|
7
7
|
|
8
|
-
Included built-in CRC modules are CRC-32, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and more.
|
8
|
+
Included built-in CRC modules are CRC-32, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and many more.
|
9
9
|
|
10
|
-
|
10
|
+
Additional your customized CRC modules are defined to posible.
|
11
11
|
|
12
|
-
This is slower than
|
12
|
+
This library is slower than ×85+ of zlib/crc32, and slower than ×120+ of extlzma/crc32 on FreeBSD 10.3R amd64.
|
13
13
|
|
14
|
-
If you need more speed, please use crc-turbo.
|
14
|
+
If you need more speed, please use [crc-turbo](https://rubygems/gems/crc-turbo).
|
15
15
|
|
16
16
|
|
17
|
-
##
|
17
|
+
## Summary
|
18
18
|
|
19
19
|
* package name: crc
|
20
20
|
* author: dearblue (mailto:dearblue@users.osdn.me)
|
21
21
|
* report issue to: <https://osdn.jp/projects/rutsubo/ticket/>
|
22
22
|
* how to install: ``gem install crc``
|
23
|
-
* version: 0.
|
23
|
+
* version: 0.2
|
24
24
|
* release quality: thechnical preview
|
25
|
-
* licensing: BSD-2-Clause
|
25
|
+
* licensing: BSD-2-Clause<br>any parts are under Creative Commons License Zero (CC0 / Public Domain), and zlib-style License.
|
26
26
|
* dependency gems: none
|
27
27
|
* dependency external c libraries: none
|
28
28
|
* bundled external c libraries: none
|
29
29
|
|
30
|
-
## FEATURES
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
*
|
37
|
-
*
|
38
|
-
*
|
39
|
-
*
|
40
|
-
*
|
41
|
-
*
|
31
|
+
## Features
|
32
|
+
|
33
|
+
This examples are used CRC-32 module. Please see CRC::BasicCRC for more details.
|
34
|
+
|
35
|
+
* CRC.crc32(seq, init = 0) -> crc-32 integer (likely as ``Zlib.crc32``)
|
36
|
+
* CRC::CRC32.crc(seq, init = 0) -> crc-32 integer (likely as ``Zlib.crc32``)
|
37
|
+
* CRC::CRC32.digest(seq, init = 0) -> crc-32 digest (likely as ``Digest::XXXX.digest``)
|
38
|
+
* CRC::CRC32.hexdigest(seq, init = 0) -> crc-32 hex-digest (likely as ``Digest::XXXX.hexdigest``)
|
39
|
+
* CRC::CRC32.new(init = 0) -> crc-32 context (likely as ``Digest::XXXX.new``)
|
40
|
+
* CRC::CRC32#update(seq) -> self (likely as ``Digest::XXXX#update``)
|
41
|
+
* CRC::CRC32#state -> crc-32 integer
|
42
|
+
* CRC::CRC32#digest -> crc-32 digest (likely as ``Digest::XXXX#digest``)
|
43
|
+
* CRC::CRC32#hexdigest -> crc-32 hex-digest (likely as ``Digest::XXXX#hexdigest``)
|
44
|
+
* CRC.crc("crc-32", seq, init = 0) -> crc-32 integer
|
45
|
+
* CRC.digest("crc-32", seq, init = 0) -> crc-32 digest
|
46
|
+
* CRC.hexdigest("crc-32", seq, init = 0) -> crc-32 hex-digest
|
47
|
+
* CRC::CRC32.combine(CRC.crc32("123"), CRC.crc32("456789"), 6) -> 3421780262 (likely as ``Zlib.crc32_comibne``)
|
48
|
+
* CRC.CRC32("123") + CRC.CRC32("456") + CRC.CRC32("789") -> #<CRC::CRC32:CBF43926>
|
42
49
|
|
43
50
|
----
|
44
51
|
|
45
|
-
*
|
52
|
+
* CRC.create\_module(bitsize, poly, init\_state, refin, refout, xorout) -> new crc module class
|
46
53
|
|
47
54
|
``` ruby:ruby
|
48
55
|
MyCRC32 = CRC.create_module(32, 0x04C11DB7)
|
@@ -51,17 +58,23 @@ If you need more speed, please use crc-turbo.
|
|
51
58
|
```
|
52
59
|
|
53
60
|
|
54
|
-
##
|
61
|
+
## Built-in CRC modules
|
55
62
|
|
56
63
|
``` shell:shell
|
57
|
-
% ruby -rcrc -e 'puts CRC::MODULE_TABLE.values.uniq.map { |m| m::
|
64
|
+
% ruby -rcrc -e 'puts CRC::MODULE_TABLE.values.uniq.map { |m| m::GENERATOR.name }.join(", ")'
|
58
65
|
```
|
59
66
|
|
60
|
-
CRC-1, CRC-3-ROHC, CRC-4-ITU, CRC-5-EPC, CRC-5-ITU, CRC-5-USB, CRC-6-CDMA2000-A, CRC-6-CDMA2000-B, CRC-6-DARC, CRC-6-ITU, CRC-7, CRC-7-MVB, CRC-8, CRC-8-CCITT, CRC-8-
|
67
|
+
CRC-1, CRC-3-ROHC, CRC-4-INTERLAKEN, CRC-4-ITU, CRC-5-EPC, CRC-5-ITU, CRC-5-USB, CRC-6-CDMA2000-A, CRC-6-CDMA2000-B, CRC-6-DARC, CRC-6-ITU, CRC-7, CRC-7-MVB, CRC-7-ROHC, CRC-7-UMTS, CRC-8, CRC-8-CCITT, CRC-8-MAXIM, CRC-8-DARC, CRC-8-SAE, CRC-8-WCDMA, CRC-8-CDMA2000, CRC-8-DVB-S2, CRC-8-EBU, CRC-8-I-CODE, CRC-8-ITU, CRC-8-LTE, CRC-8-ROHC, CRC-10, CRC-10-CDMA2000, CRC-11, CRC-11-UMTS, CRC-12-CDMA2000, CRC-12-DECT, CRC-12-UMTS, CRC-13-BBC, CRC-14-DARC, CRC-15, CRC-15-MPT1327, Chakravarty, ARC, CRC-16-ARINC, CRC-16-AUG-CCITT, CRC-16-CDMA2000, CRC-16-DECT-R, CRC-16-DECT-X, CRC-16-T10-DIF, CRC-16-DNP, CRC-16-BUYPASS, CRC-16-CCITT-FALSE, CRC-16-DDS-110, CRC-16-EN-13757, CRC-16-GENIBUS, CRC-16-LJ1200, CRC-16-MAXIM, CRC-16-MCRF4XX, CRC-16-RIELLO, CRC-16-TELEDISK, CRC-16-TMS37157, CRC-16-USB, CRC-A, KERMIT, MODBUS, X-25, XMODEM, CRC-17-CAN, CRC-21-CAN, CRC-24, CRC-24-Radix-64, CRC-24-OPENPGP, CRC-24-BLE, CRC-24-FLEXRAY-A, CRC-24-FLEXRAY-B, CRC-24-INTERLAKEN, CRC-24-LTE-A, CRC-24-LTE-B, CRC-30, CRC-30-CDMA, CRC-31-PHILIPS, CRC-32, CRC-32-BZIP2, CRC-32C, CRC-32D, CRC-32-MPEG-2, CRC-32-POSIX, CRC-32K, CRC-32K2, CRC-32Q, JAMCRC, XFER, CRC-40-GSM, CRC-64, CRC-64-ECMA, CRC-64-WE, CRC-64-ISO
|
61
68
|
|
62
69
|
|
63
|
-
##
|
70
|
+
## Environment variables for behavior
|
64
71
|
|
72
|
+
* ``RUBY_CRC_NOFAST=0``: Use "crc-turbo" if posible. When failure required, same as ``RUBY_CRC_NOFAST=1``.
|
65
73
|
* ``RUBY_CRC_NOFAST=1``: Force use ruby implementation with slice-by-16 algorithm. Not used "crc-turbo".
|
66
|
-
* ``RUBY_CRC_NOFAST=2``: Switch to lookup table algorithm from slice-by-16 algorithm. Slower
|
67
|
-
* ``RUBY_CRC_NOFAST=3``: Switch to reference algorithm from slice-by-16 algorithm. Slower
|
74
|
+
* ``RUBY_CRC_NOFAST=2``: Switch to lookup table algorithm from slice-by-16 algorithm. Slower than about 52% (when CRC-32).
|
75
|
+
* ``RUBY_CRC_NOFAST=3``: Switch to reference algorithm from slice-by-16 algorithm. Slower than about 7% (when CRC-32).
|
76
|
+
|
77
|
+
|
78
|
+
## About CRC::Generator#combine
|
79
|
+
|
80
|
+
CRC::Generator#combine is ported from Mark Adler's crccomb.c in https://stackoverflow.com/questions/29915764/generic-crc-8-16-32-64-combine-implementation#29928573 .
|
data/benchmark.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# Only this code to the PUBLIC DOMAIN.
|
3
3
|
#
|
4
4
|
|
5
|
+
require "optparse"
|
5
6
|
require "benchmark"
|
6
7
|
#require "securerandom"
|
7
8
|
require "zlib"
|
@@ -14,15 +15,25 @@ def measure(generator_name)
|
|
14
15
|
$stdout.flush
|
15
16
|
realms = 5.times.map do
|
16
17
|
real = (Benchmark.measure { yield }.real * 1000)
|
17
|
-
print " #{real.
|
18
|
+
print " #{(real * 100).round / 100.0} ms."
|
18
19
|
$stdout.flush
|
19
20
|
real
|
20
21
|
end.min
|
21
|
-
puts " (#{realms.
|
22
|
+
puts " (#{(realms * 100).round / 100.0} ms.)\n"
|
22
23
|
[generator_name, realms]
|
23
24
|
end
|
24
25
|
|
25
|
-
|
26
|
+
opt = OptionParser.new
|
27
|
+
size = 2
|
28
|
+
opt.on("-s size", "set input data size in MiB (default: #{size} MiB)") { |x| size = x.to_i }
|
29
|
+
opt.on("--no-digest-crc") { no_digest_crc = true }
|
30
|
+
opt.on("--no-extlzma") { no_extlzma = true }
|
31
|
+
opt.parse!
|
32
|
+
|
33
|
+
puts <<"EOS"
|
34
|
+
*** Benchmark with #{RUBY_DESCRIPTION}.
|
35
|
+
EOS
|
36
|
+
|
26
37
|
puts " ** preparing #{size} MiB data...\n"
|
27
38
|
#s = SecureRandom.random_bytes(size << 20)
|
28
39
|
s = "0" * (size << 20)
|
@@ -43,3 +54,7 @@ EOS
|
|
43
54
|
comparisons.each do |name, meas|
|
44
55
|
puts "%24s : ruby-crc/crc32 = %10.5f : 1.0\n" % [name, crc / meas]
|
45
56
|
end
|
57
|
+
|
58
|
+
puts <<'EOS'
|
59
|
+
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
60
|
+
EOS
|
data/gemstub.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
GEMSTUB = Gem::Specification.new do |s|
|
2
2
|
s.name = "crc"
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.2"
|
4
4
|
s.summary = "general CRC generator"
|
5
5
|
s.description = <<EOS
|
6
6
|
This is a general CRC (Cyclic Redundancy Check) generator for ruby.
|
7
|
-
It is written by pure ruby with based on slice-by-eight algorithm (byte-order
|
8
|
-
Included built-in CRC modules are CRC-32, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and more.
|
9
|
-
|
7
|
+
It is written by pure ruby with based on slice-by-eight algorithm (slice-by-16 algorithm as byte-order free and byte-alignment free).
|
8
|
+
Included built-in CRC modules are CRC-32, CRC-64-XZ, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and many more.
|
9
|
+
Additional your customized CRC modules are defined to posible.
|
10
10
|
If you need more speed, please use crc-turbo.
|
11
11
|
EOS
|
12
12
|
s.homepage = "https://osdn.jp/projects/rutsubo/"
|
13
|
-
s.
|
13
|
+
s.licenses = ["BSD-2-Clause", "Zlib", "CC0-1.0"]
|
14
14
|
s.author = "dearblue"
|
15
15
|
s.email = "dearblue@users.osdn.me"
|
16
16
|
|
data/lib/crc.rb
CHANGED
@@ -10,6 +10,30 @@ else
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
#
|
14
|
+
# This is a general CRC generator.
|
15
|
+
#
|
16
|
+
# When you want to use CRC-32 module, there are following ways:
|
17
|
+
#
|
18
|
+
# 1. Generate CRC-32'd value at direct:
|
19
|
+
#
|
20
|
+
# CRC.crc32("123456789") # => 3421780262
|
21
|
+
#
|
22
|
+
# 2. Generate CRC-32'd hex-digest at direct:
|
23
|
+
#
|
24
|
+
# CRC::CRC32.hexdigest("123456789") # => "CBF43926"
|
25
|
+
#
|
26
|
+
# 3. Streaming process:
|
27
|
+
#
|
28
|
+
# crc32 = CRC::CRC32.new # => #<CRC::CRC32:00000000>
|
29
|
+
# IO.foreach("/boot/kernel/kernel", nil, 262144, mode: "rb") do |s|
|
30
|
+
# crc32 << s
|
31
|
+
# end
|
32
|
+
# p crc32 # => #<CRC::CRC32:6A632AA5>
|
33
|
+
# p crc32.state # => 1784883877
|
34
|
+
# p crc32.digest # => "jc*\xA5"
|
35
|
+
# p crc32.hexdigest # => "6A632AA5"
|
36
|
+
#
|
13
37
|
module CRC
|
14
38
|
CRC = self
|
15
39
|
|
@@ -26,67 +50,26 @@ module CRC
|
|
26
50
|
|
27
51
|
def bitreflect(num, bitsize)
|
28
52
|
case
|
29
|
-
when bitsize >
|
53
|
+
when bitsize > 128
|
30
54
|
bitreflect_reference(num, bitsize)
|
55
|
+
when bitsize > 64
|
56
|
+
bitreflect128(num) >> (128 - bitsize)
|
31
57
|
when bitsize > 32
|
32
58
|
bitreflect64(num) >> (64 - bitsize)
|
33
59
|
when bitsize > 16
|
34
60
|
bitreflect32(num) >> (32 - bitsize)
|
35
|
-
when bitsize >
|
61
|
+
when bitsize > 8
|
36
62
|
bitreflect16(num) >> (16 - bitsize)
|
37
63
|
else
|
38
|
-
bitreflect8(num)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
if false
|
43
|
-
20.times do
|
44
|
-
n = rand(1 << 62)
|
45
|
-
bitsize = rand(64) + 1
|
46
|
-
a = bitreflect_reference(n, bitsize)
|
47
|
-
b = bitreflect(n, bitsize)
|
48
|
-
puts "0x%016X (%2d) => 0x%016X, 0x%016X (%s)" % [n, bitsize, a, b, (a == b)]
|
49
|
-
end
|
50
|
-
puts
|
51
|
-
require "benchmark"
|
52
|
-
Benchmark.bm(24) do |bm|
|
53
|
-
t = 1 << 16
|
54
|
-
4.times do
|
55
|
-
bm.report("reference(-1, 8)") { t.times { bitreflect_reference(-1, 8) } }
|
56
|
-
bm.report("reference(-1, 16)") { t.times { bitreflect_reference(-1, 16) } }
|
57
|
-
bm.report("reference(-1, 24)") { t.times { bitreflect_reference(-1, 24) } }
|
58
|
-
bm.report("reference(-1, 32)") { t.times { bitreflect_reference(-1, 32) } }
|
59
|
-
bm.report("reference(-1, 64)") { t.times { bitreflect_reference(-1, 64) } }
|
60
|
-
bm.report("bitreflect(-1, 8)") { t.times { bitreflect(-1, 8) } }
|
61
|
-
bm.report("bitreflect(-1, 16)") { t.times { bitreflect(-1, 16) } }
|
62
|
-
bm.report("bitreflect(-1, 24)") { t.times { bitreflect(-1, 24) } }
|
63
|
-
bm.report("bitreflect(-1, 32)") { t.times { bitreflect(-1, 32) } }
|
64
|
-
bm.report("bitreflect(-1, 64)") { t.times { bitreflect(-1, 64) } }
|
65
|
-
puts
|
66
|
-
end
|
67
|
-
end
|
68
|
-
abort "TEST ABORT"
|
69
|
-
end
|
70
|
-
|
71
|
-
def build_table(bitsize, polynomial)
|
72
|
-
bitmask = ~(~0 << bitsize)
|
73
|
-
carrydown = bitmask >> 1
|
74
|
-
polynomial = bitmask & polynomial
|
75
|
-
table = []
|
76
|
-
head = 7
|
77
|
-
256.times do |i|
|
78
|
-
8.times { i = (i[head] == 0) ? (i << 1) : (((i & carrydown) << 1) ^ polynomial) }
|
79
|
-
table << i
|
64
|
+
bitreflect8(num) >> (8 - bitsize)
|
80
65
|
end
|
81
|
-
|
82
|
-
table.freeze
|
83
66
|
end
|
84
67
|
|
85
|
-
def
|
68
|
+
def build_table(bitsize, polynomial, unfreeze = false, slice: 16)
|
86
69
|
bitmask = ~(~0 << bitsize)
|
87
70
|
table = []
|
88
71
|
Aux.slide_to_head(bitsize, 0, bitmask & polynomial, bitmask) do |xx, poly, csh, head, carries, pad|
|
89
|
-
|
72
|
+
slice.times do |s|
|
90
73
|
table << (t = [])
|
91
74
|
256.times do |b|
|
92
75
|
r = (s == 0 ? (b << csh) : (table[-2][b]))
|
@@ -102,21 +85,10 @@ module CRC
|
|
102
85
|
table
|
103
86
|
end
|
104
87
|
|
105
|
-
def
|
106
|
-
polynomial = bitreflect(polynomial, bitsize)
|
107
|
-
table = []
|
108
|
-
256.times do |i|
|
109
|
-
8.times { i = (i[0] == 0) ? (i >> 1) : ((i >> 1) ^ polynomial) }
|
110
|
-
table << i
|
111
|
-
end
|
112
|
-
|
113
|
-
table.freeze
|
114
|
-
end
|
115
|
-
|
116
|
-
def build_table8!(bitsize, polynomial, unfreeze = false)
|
88
|
+
def build_reflect_table(bitsize, polynomial, unfreeze = false, slice: 16)
|
117
89
|
polynomial = bitreflect(polynomial, bitsize)
|
118
90
|
table = []
|
119
|
-
|
91
|
+
slice.times do |s|
|
120
92
|
table << (t = [])
|
121
93
|
256.times do |b|
|
122
94
|
r = (s == 0) ? b : table[-2][b]
|
@@ -209,9 +181,8 @@ module CRC
|
|
209
181
|
|
210
182
|
def setup(state = nil)
|
211
183
|
state ||= initial_state
|
212
|
-
state ^= xor_output
|
213
184
|
state = CRC.bitreflect(state, bitsize) if reflect_input ^ reflect_output
|
214
|
-
state
|
185
|
+
state ^ xor_output
|
215
186
|
end
|
216
187
|
|
217
188
|
def finish(state)
|
@@ -219,6 +190,9 @@ module CRC
|
|
219
190
|
state ^ xor_output
|
220
191
|
end
|
221
192
|
|
193
|
+
alias reflect_input? reflect_input
|
194
|
+
alias reflect_output? reflect_output
|
195
|
+
|
222
196
|
def digest(seq, state = nil)
|
223
197
|
Aux.digest(crc(seq, state), bitsize)
|
224
198
|
end
|
@@ -257,9 +231,9 @@ module CRC
|
|
257
231
|
end
|
258
232
|
|
259
233
|
if nm = name
|
260
|
-
"#{nm}(CRC-%d-0x%0#{width}X init=%s
|
234
|
+
"#{nm}(CRC-%d-0x%0#{width}X%s init=%s, xor=%s)" % [bitsize, polynomial, ref, init, xor]
|
261
235
|
else
|
262
|
-
"(CRC-%d-0x%0#{width}X init=%s
|
236
|
+
"(CRC-%d-0x%0#{width}X%s init=%s, xor=%s)" % [bitsize, polynomial, ref, init, xor]
|
263
237
|
end
|
264
238
|
end
|
265
239
|
|
@@ -272,7 +246,7 @@ module CRC
|
|
272
246
|
end
|
273
247
|
end
|
274
248
|
|
275
|
-
class BasicCRC < Struct.new(:internal_state, :initial_state)
|
249
|
+
class BasicCRC < Struct.new(:internal_state, :initial_state, :size)
|
276
250
|
BasicStruct = superclass
|
277
251
|
|
278
252
|
class BasicStruct
|
@@ -280,38 +254,93 @@ module CRC
|
|
280
254
|
alias set_state! internal_state=
|
281
255
|
end
|
282
256
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
257
|
+
#
|
258
|
+
# call-seq:
|
259
|
+
# initialize(initial_state = nil, size = 0)
|
260
|
+
# initialize(seq, initial_state = nil, size = 0)
|
261
|
+
#
|
262
|
+
def initialize(*args)
|
263
|
+
initialize_args(args) do |seq, initial_state, size|
|
264
|
+
g = self.class::GENERATOR
|
265
|
+
initial_state ||= g.initial_state
|
266
|
+
super g.setup(initial_state.to_i), initial_state.to_i, size.to_i
|
267
|
+
update(seq) if seq
|
268
|
+
end
|
287
269
|
end
|
288
270
|
|
289
|
-
def reset(initial_state = self.initial_state)
|
290
|
-
|
291
|
-
initial_state ||=
|
292
|
-
set_state!
|
271
|
+
def reset(initial_state = self.initial_state, size = 0)
|
272
|
+
g = self.class::GENERATOR
|
273
|
+
initial_state ||= g.initial_state
|
274
|
+
set_state! g.setup(initial_state)
|
293
275
|
self.initial_state = initial_state
|
276
|
+
self.size = size.to_i
|
294
277
|
self
|
295
278
|
end
|
296
279
|
|
297
280
|
def update(seq)
|
298
|
-
set_state! self.class::GENERATOR.update
|
281
|
+
set_state! self.class::GENERATOR.update(seq, state!)
|
282
|
+
self.size += seq.bytesize
|
299
283
|
self
|
300
284
|
end
|
301
285
|
|
302
286
|
alias << update
|
303
287
|
|
304
|
-
def
|
288
|
+
def state
|
305
289
|
self.class::GENERATOR.finish(state!)
|
306
290
|
end
|
307
291
|
|
308
|
-
|
292
|
+
def +(crc2)
|
293
|
+
raise ArgumentError, "not a CRC instance (#{crc2.inspect})" unless crc2.kind_of?(BasicCRC)
|
294
|
+
c1 = self.class
|
295
|
+
g1 = c1::GENERATOR
|
296
|
+
g2 = crc2.class::GENERATOR
|
297
|
+
unless g1.bitsize == g2.bitsize &&
|
298
|
+
g1.polynomial == g2.polynomial &&
|
299
|
+
g1.reflect_input == g2.reflect_input &&
|
300
|
+
g1.reflect_output == g2.reflect_output &&
|
301
|
+
# g1.initial_state == g2.initial_state &&
|
302
|
+
g1.xor_output == g2.xor_output
|
303
|
+
raise ArgumentError, "different CRC module (#{g1.inspect} and #{g2.inspect})"
|
304
|
+
end
|
305
|
+
c1.new(g1.combine(state, crc2.state, crc2.size), size + crc2.size)
|
306
|
+
end
|
307
|
+
|
308
|
+
def ==(a)
|
309
|
+
case a
|
310
|
+
when BasicCRC
|
311
|
+
c1 = self.class
|
312
|
+
g1 = c1::GENERATOR
|
313
|
+
g2 = a.class::GENERATOR
|
314
|
+
if g1.bitsize == g2.bitsize &&
|
315
|
+
g1.polynomial == g2.polynomial &&
|
316
|
+
g1.reflect_input == g2.reflect_input &&
|
317
|
+
g1.reflect_output == g2.reflect_output &&
|
318
|
+
# g1.initial_state == g2.initial_state &&
|
319
|
+
g1.xor_output == g2.xor_output &&
|
320
|
+
state! == a.state!
|
321
|
+
true
|
322
|
+
else
|
323
|
+
false
|
324
|
+
end
|
325
|
+
when Integer
|
326
|
+
state == a
|
327
|
+
else
|
328
|
+
super
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
alias to_i state
|
333
|
+
alias to_int state
|
334
|
+
|
335
|
+
def to_a
|
336
|
+
[state]
|
337
|
+
end
|
309
338
|
|
310
339
|
def digest
|
311
340
|
Aux.DIGEST(state, self.class::GENERATOR.bitsize) { |n| [n].pack("C") }
|
312
341
|
end
|
313
342
|
|
314
|
-
#
|
343
|
+
# return digest as internal state
|
315
344
|
def digest!
|
316
345
|
Aux.DIGEST(state!, self.class::GENERATOR.bitsize) { |n| [n].pack("C") }
|
317
346
|
end
|
@@ -320,7 +349,7 @@ module CRC
|
|
320
349
|
Aux.DIGEST(state, self.class::GENERATOR.bitsize) { |n| "%02X" % n }
|
321
350
|
end
|
322
351
|
|
323
|
-
#
|
352
|
+
# return hex-digest as internal state
|
324
353
|
def hexdigest!
|
325
354
|
Aux.DIGEST(state!, self.class::GENERATOR.bitsize) { |n| "%02X" % n }
|
326
355
|
end
|
@@ -337,8 +366,31 @@ module CRC
|
|
337
366
|
end
|
338
367
|
|
339
368
|
class << self
|
340
|
-
|
369
|
+
alias [] new
|
370
|
+
|
371
|
+
#
|
372
|
+
# call-seq:
|
373
|
+
# combine(crc1, crc2) -> new combined crc
|
374
|
+
# combine(crc1_int, crc2_int, crc2_len) -> new combined crc
|
375
|
+
#
|
376
|
+
def combine(crc1, crc2, len2 = nil)
|
377
|
+
return crc1 + crc2 if crc1.kind_of?(BasicCRC) && crc2.kind_of?(BasicCRC)
|
378
|
+
self::GENERATOR.combine(crc1.to_i, crc2.to_i, len2)
|
379
|
+
end
|
380
|
+
|
381
|
+
def crc(seq, state = nil)
|
382
|
+
self::GENERATOR.crc(seq, state)
|
383
|
+
end
|
341
384
|
|
385
|
+
def digest(seq, state = nil)
|
386
|
+
Aux.digest(self::GENERATOR.crc(seq, state), self::GENERATOR.bitsize)
|
387
|
+
end
|
388
|
+
|
389
|
+
def hexdigest(seq, state = nil)
|
390
|
+
Aux.hexdigest(self::GENERATOR.crc(seq, state), self::GENERATOR.bitsize)
|
391
|
+
end
|
392
|
+
|
393
|
+
def inspect
|
342
394
|
if const_defined?(:GENERATOR)
|
343
395
|
if nm = name
|
344
396
|
"#{nm}(#{self::GENERATOR.to_s})"
|
@@ -353,17 +405,29 @@ module CRC
|
|
353
405
|
def pretty_inspect(q)
|
354
406
|
q.text inspect
|
355
407
|
end
|
408
|
+
end
|
356
409
|
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
410
|
+
private
|
411
|
+
def initialize_args(args)
|
412
|
+
case args.size
|
413
|
+
when 0
|
414
|
+
yield nil, nil, 0
|
415
|
+
when 1
|
416
|
+
if args[0].kind_of?(String)
|
417
|
+
yield args[0], nil, 0
|
418
|
+
else
|
419
|
+
yield nil, args[0], 0
|
420
|
+
end
|
421
|
+
when 2
|
422
|
+
if args[0].kind_of?(String)
|
423
|
+
yield args[0], args[1], 0
|
424
|
+
else
|
425
|
+
yield nil, args[0], args[1].to_i
|
426
|
+
end
|
427
|
+
when 3
|
428
|
+
yield args[0], args[1], args[2].to_i
|
429
|
+
else
|
430
|
+
raise ArgumentError, "wrong argument size (given #{args.size}, expect 0..3)"
|
367
431
|
end
|
368
432
|
end
|
369
433
|
end
|
@@ -392,14 +456,60 @@ module CRC
|
|
392
456
|
end
|
393
457
|
|
394
458
|
def create_module(bitsize, polynomial, initial_state = 0, refin = true, refout = true, xor = ~0, name = nil)
|
395
|
-
|
459
|
+
g = Generator.new(bitsize, polynomial, initial_state, refin, refout, xor, name)
|
396
460
|
crc = Class.new(BasicCRC)
|
397
|
-
crc.const_set :GENERATOR,
|
461
|
+
crc.const_set :GENERATOR, g
|
398
462
|
crc
|
399
463
|
end
|
400
464
|
end
|
401
465
|
|
402
|
-
|
403
|
-
|
466
|
+
require_relative "crc/_modules"
|
467
|
+
require_relative "crc/_combine"
|
468
|
+
|
469
|
+
#
|
470
|
+
# Create CRC module classes.
|
471
|
+
#
|
472
|
+
LIST.each do |bitsize, polynomial, refin, refout, initial_state, xor, check, *names|
|
473
|
+
names.map! { |nm| nm.freeze }
|
474
|
+
|
475
|
+
crc = create_module(bitsize, polynomial, initial_state, refin, refout, xor, names[0])
|
476
|
+
crc.const_set :NAME, names
|
477
|
+
|
478
|
+
names.each do |nm|
|
479
|
+
nm1 = nm.downcase.gsub(/[\W_]+/, "")
|
480
|
+
if MODULE_TABLE.key?(nm1)
|
481
|
+
raise NameError, "collision crc-module name: #{nm} (#{crc::GENERATOR} and #{MODULE_TABLE[nm1]::GENERATOR})"
|
482
|
+
end
|
483
|
+
MODULE_TABLE[nm1] = crc
|
484
|
+
end
|
485
|
+
name = names[0].sub(/(?<=\bCRC)-(?=\d+)/, "").gsub(/[\W]+/, "_")
|
486
|
+
const_set(name, crc)
|
487
|
+
|
488
|
+
check = Integer(check.to_i) if check
|
489
|
+
crc.const_set :CHECK, check
|
490
|
+
|
491
|
+
g = crc::GENERATOR
|
492
|
+
define_singleton_method(name.upcase, ->(*args) { crc.new(*args) })
|
493
|
+
define_singleton_method(name.downcase, ->(*args) { g.crc(*args) })
|
494
|
+
end
|
495
|
+
|
496
|
+
if $0 == __FILE__
|
497
|
+
$stderr.puts "#{__FILE__}:#{__LINE__}: SELF CHECK for CRC modules (#{File.basename($".grep(/_(?:byruby|turbo)/)[0]||"")})\n"
|
498
|
+
MODULE_TABLE.values.uniq.each do |crc|
|
499
|
+
g = crc::GENERATOR
|
500
|
+
check = crc::CHECK
|
501
|
+
checked = g.crc("123456789")
|
502
|
+
case check
|
503
|
+
when nil
|
504
|
+
$stderr.puts "| %20s(\"123456789\") = %16X (check only)\n" % [g.name, checked]
|
505
|
+
when checked
|
506
|
+
;
|
507
|
+
else
|
508
|
+
$stderr.puts "| %20s(\"123456789\") = %16X (expect to %X)\n" % [g.name, checked, check]
|
509
|
+
end
|
510
|
+
end
|
511
|
+
$stderr.puts "#{__FILE__}:#{__LINE__}: DONE SELF CHECK\n"
|
404
512
|
|
405
|
-
|
513
|
+
exit
|
514
|
+
end
|
515
|
+
end
|
data/lib/crc/_byruby.rb
CHANGED
@@ -1,18 +1,26 @@
|
|
1
|
+
#!ruby
|
2
|
+
|
1
3
|
#--
|
2
4
|
# Author:: dearblue <dearblue@users.osdn.me>
|
3
|
-
# License::
|
5
|
+
# License:: Creative Commons License Zero (CC0 / Public Domain)
|
4
6
|
#++
|
5
7
|
|
8
|
+
#
|
9
|
+
# \* \* \* \* \* \* \* \*
|
6
10
|
#
|
7
11
|
# Ruby implemented CRC generator.
|
8
|
-
# It's
|
12
|
+
# It's used slice-by-16 algorithm with byte-order free and byte-alignment free.
|
13
|
+
# This is based on the Intel's slice-by-eight algorithm.
|
9
14
|
#
|
10
15
|
# It's faster than about 50% (CRC-32) and about 30% (CRC-64) of
|
11
16
|
# lookup-table algorithm. But need more memory.
|
12
17
|
#
|
13
18
|
# reference:
|
14
|
-
# *
|
15
|
-
# * xz-utils
|
19
|
+
# * https://sourceforge.net/projects/slicing-by-8/
|
20
|
+
# * xz-utils
|
21
|
+
# * http://tukaani.org/xz/
|
22
|
+
# * xz-5.2.2/src/liblzma/check/crc32_fast.c
|
23
|
+
# * xz-5.2.2/src/liblzma/check/crc32_tablegen.c
|
16
24
|
#
|
17
25
|
# If defined "RUBY_CRC_NOFAST=2" enviroment variable, switch to lookup-table algorithm.
|
18
26
|
#
|
@@ -66,7 +74,7 @@ module CRC
|
|
66
74
|
end
|
67
75
|
end
|
68
76
|
|
69
|
-
class Generator < Struct.new(:bitsize, :bitmask, :polynomial, :initial_state, :
|
77
|
+
class Generator < Struct.new(:bitsize, :bitmask, :polynomial, :initial_state, :table, :reflect_input, :reflect_output, :xor_output, :name)
|
70
78
|
BasicStruct = superclass
|
71
79
|
|
72
80
|
def initialize(bitsize, polynomial, initial_state = 0, reflect_input = true, reflect_output = true, xor_output = ~0, name = nil)
|
@@ -108,7 +116,7 @@ module CRC
|
|
108
116
|
end
|
109
117
|
|
110
118
|
def update_with_lookup_table(seq, state)
|
111
|
-
t =
|
119
|
+
t = table[0]
|
112
120
|
|
113
121
|
if reflect_input
|
114
122
|
String(seq).each_byte do |ch|
|
@@ -127,7 +135,7 @@ module CRC
|
|
127
135
|
end
|
128
136
|
|
129
137
|
def update_with_slice_by_eight(seq, s)
|
130
|
-
tX =
|
138
|
+
tX = table
|
131
139
|
t0 = tX[ 0]; t1 = tX[ 1]; t2 = tX[ 2]; t3 = tX[ 3]
|
132
140
|
t4 = tX[ 4]; t5 = tX[ 5]; t6 = tX[ 6]; t7 = tX[ 7]
|
133
141
|
t8 = tX[ 8]; t9 = tX[ 9]; tA = tX[10]; tB = tX[11]
|
@@ -140,6 +148,7 @@ module CRC
|
|
140
148
|
if reflect_input
|
141
149
|
if bitsize <= 32
|
142
150
|
# speed improvement for 32-bits CRC
|
151
|
+
i = 0
|
143
152
|
while i < iii
|
144
153
|
s = tF[seq.getbyte(i ) ^ (s ) & 0xff] ^ tE[seq.getbyte(i + 1) ^ (s >> 8) & 0xff] ^
|
145
154
|
tD[seq.getbyte(i + 2) ^ (s >> 16) & 0xff] ^ tC[seq.getbyte(i + 3) ^ (s >> 24) & 0xff] ^
|
@@ -152,6 +161,7 @@ module CRC
|
|
152
161
|
i += 16
|
153
162
|
end
|
154
163
|
else
|
164
|
+
i = 0
|
155
165
|
while i < iii
|
156
166
|
s = tF[seq.getbyte(i ) ^ (s ) & 0xff] ^ tE[seq.getbyte(i + 1) ^ (s >> 8) & 0xff] ^
|
157
167
|
tD[seq.getbyte(i + 2) ^ (s >> 16) & 0xff] ^ tC[seq.getbyte(i + 3) ^ (s >> 24) & 0xff] ^
|
@@ -192,16 +202,14 @@ module CRC
|
|
192
202
|
end
|
193
203
|
end
|
194
204
|
|
195
|
-
def
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
set_table8 t = CRC.build_table8(bitsize, polynomial)
|
201
|
-
end
|
205
|
+
def table
|
206
|
+
if reflect_input
|
207
|
+
set_table t = CRC.build_reflect_table(bitsize, polynomial, slice: 16)
|
208
|
+
else
|
209
|
+
set_table t = CRC.build_table(bitsize, polynomial, slice: 16)
|
202
210
|
end
|
203
211
|
|
204
|
-
define_singleton_method :
|
212
|
+
define_singleton_method :table, self.class.superclass.instance_method(:table)
|
205
213
|
|
206
214
|
t
|
207
215
|
end
|
@@ -216,10 +224,10 @@ module CRC
|
|
216
224
|
end
|
217
225
|
|
218
226
|
class BasicStruct
|
219
|
-
alias
|
220
|
-
private :
|
227
|
+
alias set_table table=
|
228
|
+
private :set_table
|
221
229
|
|
222
|
-
undef :bitsize=, :bitmask=, :polynomial=, :initial_state=, :
|
230
|
+
undef :bitsize=, :bitmask=, :polynomial=, :initial_state=, :table=,
|
223
231
|
:reflect_input=, :reflect_output=, :xor_output=, :name=, :[]=
|
224
232
|
end
|
225
233
|
end
|
data/lib/crc/_combine.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
#!ruby
|
2
|
+
|
3
|
+
#--
|
4
|
+
# This part is based from http://stackoverflow.com/questions/29915764/generic-crc-8-16-32-64-combine-implementation
|
5
|
+
#
|
6
|
+
# > /* crccomb.c -- generalized combination of CRCs
|
7
|
+
# > * Copyright (C) 2015 Mark Adler
|
8
|
+
# > * Version 1.1 29 Apr 2015 Mark Adler
|
9
|
+
# > */
|
10
|
+
# >
|
11
|
+
# > /*
|
12
|
+
# > This software is provided 'as-is', without any express or implied
|
13
|
+
# > warranty. In no event will the author be held liable for any damages
|
14
|
+
# > arising from the use of this software.
|
15
|
+
# >
|
16
|
+
# > Permission is granted to anyone to use this software for any purpose,
|
17
|
+
# > including commercial applications, and to alter it and redistribute it
|
18
|
+
# > freely, subject to the following restrictions:
|
19
|
+
# >
|
20
|
+
# > 1. The origin of this software must not be misrepresented; you must not
|
21
|
+
# > claim that you wrote the original software. If you use this software
|
22
|
+
# > in a product, an acknowledgment in the product documentation would be
|
23
|
+
# > appreciated but is not required.
|
24
|
+
# > 2. Altered source versions must be plainly marked as such, and must not be
|
25
|
+
# > misrepresented as being the original software.
|
26
|
+
# > 3. This notice may not be removed or altered from any source distribution.
|
27
|
+
# >
|
28
|
+
# > Mark Adler
|
29
|
+
# > madler@alumni.caltech.edu
|
30
|
+
# > */
|
31
|
+
#
|
32
|
+
# Ported by:: dearblue <dearblue@users.osdn.me>
|
33
|
+
# License:: zlib-style
|
34
|
+
#--
|
35
|
+
|
36
|
+
module CRC
|
37
|
+
module Aux
|
38
|
+
def self.gf2_matrix_times(matrix, vector)
|
39
|
+
sum = 0
|
40
|
+
matrix.each do |m|
|
41
|
+
break unless vector > 0
|
42
|
+
sum ^= m unless vector[0] == 0
|
43
|
+
vector >>= 1
|
44
|
+
end
|
45
|
+
|
46
|
+
sum
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.gf2_matrix_square(bitsize, square, matrix)
|
50
|
+
bitsize.times do |n|
|
51
|
+
square[n] = gf2_matrix_times(matrix, matrix[n])
|
52
|
+
end
|
53
|
+
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Generator
|
59
|
+
def combine(crc1, crc2, len2)
|
60
|
+
return crc1 unless len2 > 1
|
61
|
+
|
62
|
+
crc1 ^= initial_state
|
63
|
+
|
64
|
+
odd = []
|
65
|
+
even = []
|
66
|
+
if reflect_output
|
67
|
+
odd << Utils.bitreflect(polynomial, bitsize)
|
68
|
+
col = 1
|
69
|
+
(bitsize - 1).times do
|
70
|
+
odd << col
|
71
|
+
col <<= 1
|
72
|
+
end
|
73
|
+
else
|
74
|
+
col = 2
|
75
|
+
(bitsize - 1).times do
|
76
|
+
odd << col
|
77
|
+
col <<= 1
|
78
|
+
end
|
79
|
+
odd << polynomial
|
80
|
+
end
|
81
|
+
|
82
|
+
Aux.gf2_matrix_square(bitsize, even, odd)
|
83
|
+
Aux.gf2_matrix_square(bitsize, odd, even)
|
84
|
+
|
85
|
+
while true
|
86
|
+
Aux.gf2_matrix_square(bitsize, even, odd)
|
87
|
+
if len2[0] == 1
|
88
|
+
crc1 = Aux.gf2_matrix_times(even, crc1)
|
89
|
+
end
|
90
|
+
len2 >>= 1
|
91
|
+
break unless len2 > 0
|
92
|
+
|
93
|
+
Aux.gf2_matrix_square(bitsize, odd, even)
|
94
|
+
if len2[0] == 1
|
95
|
+
crc1 = Aux.gf2_matrix_times(odd, crc1)
|
96
|
+
end
|
97
|
+
len2 >>= 1;
|
98
|
+
break unless len2 > 0
|
99
|
+
end
|
100
|
+
|
101
|
+
crc1 ^ crc2
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/lib/crc/_modules.rb
CHANGED
@@ -1,105 +1,121 @@
|
|
1
1
|
#!ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
#--
|
4
|
+
# Author:: dearblue <dearblue@users.osdn.me>
|
5
|
+
# License:: Creative Commons License Zero (CC0 / Public Domain)
|
6
|
+
#
|
7
|
+
# references from:
|
8
|
+
# * https://en.wikipedia.org/wiki/Cyclic_redundancy_check
|
9
|
+
# * https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB
|
10
|
+
# * http://reveng.sourceforge.net/crc-catalogue/all.htm
|
11
|
+
# * http://crcmod.sourceforge.net/crcmod.predefined.html
|
12
|
+
# * https://github.com/cluelogic/cluelib/blob/master/src/cl_crc.svh
|
13
|
+
# * https://users.ece.cmu.edu/~koopman/crc/hw_data.html
|
14
|
+
# * https://users.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf
|
15
|
+
#++
|
13
16
|
|
14
|
-
|
17
|
+
module CRC
|
18
|
+
LIST = [
|
15
19
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
20
|
+
# bit size, polynomial, initial state,
|
21
|
+
# refrect input, xor output,
|
22
|
+
# reflect output, crc("123456789"), names...
|
19
23
|
#
|
20
|
-
[
|
21
|
-
[
|
22
|
-
[
|
23
|
-
[
|
24
|
-
[
|
25
|
-
[
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[
|
29
|
-
[
|
30
|
-
[
|
31
|
-
[
|
32
|
-
[
|
33
|
-
[
|
34
|
-
[
|
35
|
-
[
|
36
|
-
[
|
37
|
-
[
|
38
|
-
[
|
39
|
-
[
|
40
|
-
[
|
41
|
-
[
|
42
|
-
[
|
43
|
-
[
|
44
|
-
[
|
45
|
-
[
|
46
|
-
[
|
47
|
-
[
|
48
|
-
[
|
49
|
-
[
|
50
|
-
[
|
51
|
-
[
|
52
|
-
[
|
53
|
-
[
|
54
|
-
[
|
55
|
-
[
|
56
|
-
[
|
57
|
-
[
|
58
|
-
[
|
59
|
-
[
|
60
|
-
[
|
61
|
-
[
|
62
|
-
[
|
63
|
-
[
|
64
|
-
[
|
65
|
-
[
|
66
|
-
[
|
67
|
-
[
|
68
|
-
[
|
24
|
+
[ 1, 0x01, true, true, 0, ~0, 0x01, "CRC-1"],
|
25
|
+
[ 3, 0x03, true, true, ~0, 0, 0x06, "CRC-3-ROHC", "CRC-3-RFC 3095"],
|
26
|
+
[ 4, 0x03, false, false, 0, ~0, 0x0b, "CRC-4-INTERLAKEN"],
|
27
|
+
[ 4, 0x03, true, true, 0, 0, 0x07, "CRC-4-ITU"],
|
28
|
+
[ 5, 0x09, false, false, 0x09, 0, 0x00, "CRC-5-EPC"],
|
29
|
+
[ 5, 0x15, true, true, 0, 0, 0x07, "CRC-5-ITU"],
|
30
|
+
[ 5, 0x05, true, true, 0, ~0, 0x19, "CRC-5-USB"],
|
31
|
+
[ 6, 0x27, false, false, ~0, 0, 0x0D, "CRC-6-CDMA2000-A"],
|
32
|
+
[ 6, 0x07, false, false, ~0, 0, 0x3B, "CRC-6-CDMA2000-B"],
|
33
|
+
[ 6, 0x19, true, true, 0, 0, 0x26, "CRC-6-DARC"],
|
34
|
+
[ 6, 0x03, true, true, 0, 0, 0x06, "CRC-6-ITU"],
|
35
|
+
[ 7, 0x09, false, false, 0, 0, 0x75, "CRC-7", "CRC-7-JESD84-A441"],
|
36
|
+
[ 7, 0x65, false, false, 0, 0, nil, "CRC-7-MVB"],
|
37
|
+
[ 7, 0x4F, true, true, ~0, 0, 0x53, "CRC-7-ROHC", "CRC-7-RFC 3095"],
|
38
|
+
[ 7, 0x45, false, false, 0, 0, 0x61, "CRC-7-UMTS"],
|
39
|
+
[ 8, 0xD5, false, false, 0, 0, nil, "CRC-8"],
|
40
|
+
[ 8, 0x07, false, false, 0, 0, 0xF4, "CRC-8-CCITT", "CRC-8-SMBus"],
|
41
|
+
[ 8, 0x31, true, true, 0, 0, 0xA1, "CRC-8-MAXIM", "CRC-8-Dallas/Maxim", "DOW-CRC"],
|
42
|
+
[ 8, 0x39, true, true, 0, 0, 0x15, "CRC-8-DARC"],
|
43
|
+
[ 8, 0x1D, false, false, 0, ~0, 0x4B, "CRC-8-SAE", "CRC-8-SAE-J1850"],
|
44
|
+
[ 8, 0x9B, true, true, 0, 0, 0x25, "CRC-8-WCDMA"],
|
45
|
+
[ 8, 0x9B, false, false, ~0, 0, 0xDA, "CRC-8-CDMA2000"],
|
46
|
+
[ 8, 0xD5, false, false, 0, 0, 0xBC, "CRC-8-DVB-S2"],
|
47
|
+
[ 8, 0x1D, true, true, ~0, 0, 0x97, "CRC-8-EBU", "CRC-8-AES"],
|
48
|
+
[ 8, 0x1D, false, false, 0xFD, 0, 0x7E, "CRC-8-I-CODE"],
|
49
|
+
[ 8, 0x07, false, false, 0x55, 0x55, 0xA1, "CRC-8-ITU"],
|
50
|
+
[ 8, 0x9B, false, false, 0, 0, 0xEA, "CRC-8-LTE"],
|
51
|
+
[ 8, 0x07, true, true, ~0, 0, 0xD0, "CRC-8-ROHC", "CRC-8-RFC 3095"],
|
52
|
+
[10, 0x0233, false, false, 0, 0, 0x0199, "CRC-10"],
|
53
|
+
[10, 0x03D9, false, false, ~0, 0, 0x0233, "CRC-10-CDMA2000"],
|
54
|
+
[11, 0x0385, false, false, 0x001A, 0, 0x05A3, "CRC-11"],
|
55
|
+
[11, 0x0307, false, false, 0, 0, 0x0061, "CRC-11-UMTS"],
|
56
|
+
[12, 0x0F13, false, false, ~0, 0, 0x0D4D, "CRC-12-CDMA2000"],
|
57
|
+
[12, 0x080F, false, false, 0, 0, 0x0F5B, "CRC-12-DECT", "X-CRC-12"],
|
58
|
+
[12, 0x080F, false, true, 0, 0, 0x0DAF, "CRC-12-UMTS", "CRC-12-3GPP"],
|
59
|
+
[13, 0x1CF5, false, false, 0, 0, 0x04FA, "CRC-13-BBC"],
|
60
|
+
[14, 0x0805, true, true, 0, 0, 0x082D, "CRC-14-DARC"],
|
61
|
+
[15, 0x4599, false, false, 0, 0, 0x059E, "CRC-15", "CRC-15-CAN"],
|
62
|
+
[15, 0x6815, false, false, 1, 1, 0x2566, "CRC-15-MPT1327"],
|
63
|
+
[16, 0x2F15, false, false, 0, 0, nil, "Chakravarty"],
|
64
|
+
[16, 0x8005, true, true, 0, 0, 0xBB3D, "ARC", "CRC-16", "CRC-IBM", "CRC-16-ARC", "CRC-16-LHA"],
|
65
|
+
[16, 0xA02B, false, false, 0, 0, nil, "CRC-16-ARINC"],
|
66
|
+
[16, 0x1021, false, false, 0x1D0F, 0, 0xE5CC, "CRC-16-AUG-CCITT", "CRC-16-SPI-FUJITSU"],
|
67
|
+
[16, 0xC867, false, false, ~0, 0, 0x4C06, "CRC-16-CDMA2000"],
|
68
|
+
[16, 0x0589, false, false, 1, 1, 0x007E, "CRC-16-DECT-R", "R-CRC-16"],
|
69
|
+
[16, 0x0589, false, false, 0, 0, 0x007F, "CRC-16-DECT-X", "X-CRC-16"],
|
70
|
+
[16, 0x8BB7, false, false, 0, 0, 0xD0DB, "CRC-16-T10-DIF"],
|
71
|
+
[16, 0x3D65, true, true, ~0, ~0, 0xEA82, "CRC-16-DNP"],
|
72
|
+
[16, 0x8005, false, false, 0, 0, 0xFEE8, "CRC-16-BUYPASS", "CRC-16-VERIFONE", "CRC-16-UMTS"],
|
73
|
+
[16, 0x1021, false, false, ~0, 0, 0x29B1, "CRC-16-CCITT-FALSE"],
|
74
|
+
[16, 0x8005, false, false, 0x800D, 0, 0x9ECF, "CRC-16-DDS-110"],
|
75
|
+
[16, 0x3D65, false, false, ~0, ~0, 0xC2B7, "CRC-16-EN-13757"],
|
76
|
+
[16, 0x1021, false, false, 0, ~0, 0xD64E, "CRC-16-GENIBUS", "CRC-16-EPC", "CRC-16-I-CODE", "CRC-16-DARC"],
|
77
|
+
[16, 0x6F63, false, false, 0, 0, 0xBDF4, "CRC-16-LJ1200"],
|
78
|
+
[16, 0x8005, true, true, ~0, ~0, 0x44C2, "CRC-16-MAXIM"],
|
79
|
+
[16, 0x1021, true, true, ~0, 0, 0x6F91, "CRC-16-MCRF4XX"],
|
80
|
+
[16, 0x1021, true, true, 0xB2AA, 0, 0x63D0, "CRC-16-RIELLO"],
|
81
|
+
[16, 0xA097, false, false, 0, 0, 0x0FB3, "CRC-16-TELEDISK"],
|
82
|
+
[16, 0x1021, true, true, 0x89EC, 0, 0x26B1, "CRC-16-TMS37157"],
|
83
|
+
[16, 0x8005, true, true, 0, ~0, 0xB4C8, "CRC-16-USB"],
|
84
|
+
[16, 0x1021, true, true, 0xC6C6, 0, 0xBF05, "CRC-A", "CRC-16-ISO/IEC FCD 14443-3"],
|
85
|
+
[16, 0x1021, true, true, 0, 0, 0x2189, "KERMIT", "CRC-16-CCITT", "CRC-16-CCITT-TRUE", "CRC-CCITT"],
|
86
|
+
[16, 0x8005, true, true, ~0, 0, 0x4B37, "MODBUS"],
|
87
|
+
[16, 0x1021, true, true, 0, ~0, 0x906E, "X-25", "CRC-16-IBM-SDLC", "CRC-16-ISO-HDLC", "CRC-B"],
|
88
|
+
[16, 0x1021, false, false, 0, 0, 0x31C3, "XMODEM", "ZMODEM", "CRC-16-ACORN", "CRC-16-LTE"],
|
89
|
+
[17, 0x0001685B, false, false, 0, 0, nil, "CRC-17-CAN"],
|
90
|
+
[21, 0x00102899, false, false, 0, 0, nil, "CRC-21-CAN"],
|
91
|
+
[24, 0x005D6DCB, false, false, 0, 0, nil, "CRC-24"],
|
92
|
+
[24, 0x00864CFB, false, false, 0, 0, 0x00CDE703, "CRC-24-Radix-64"],
|
93
|
+
[24, 0x00864CFB, false, false, 0x00B704CE, 0, 0x0021CF02, "CRC-24-OPENPGP"],
|
94
|
+
[24, 0x0000065B, true, true, 0x00555555, 0, 0x00C25A56, "CRC-24-BLE"],
|
95
|
+
[24, 0x005D6DCB, false, false, 0x00FEDCBA, 0, 0x007979BD, "CRC-24-FLEXRAY-A"],
|
96
|
+
[24, 0x005D6DCB, false, false, 0x00ABCDEF, 0, 0x001F23B8, "CRC-24-FLEXRAY-B"],
|
97
|
+
[24, 0x00328B63, false, false, 0, ~0, 0x00B4F3E6, "CRC-24-INTERLAKEN"],
|
98
|
+
[24, 0x00864CFB, false, false, 0, 0, 0x00CDE703, "CRC-24-LTE-A"],
|
99
|
+
[24, 0x00800063, false, false, 0, 0, 0x0023EF52, "CRC-24-LTE-B"],
|
100
|
+
[30, 0x2030B9C7, false, false, 0, 0, nil, "CRC-30"],
|
101
|
+
[30, 0x2030B9C7, false, false, 0, ~0, 0x04C34ABF, "CRC-30-CDMA"],
|
102
|
+
[31, 0x04C11DB7, false, false, 0, ~0, 0x0CE9E46C, "CRC-31-PHILIPS"],
|
103
|
+
[32, 0x04C11DB7, true, true, 0, ~0, 0xCBF43926, "CRC-32", "CRC-32-ADCCP", "PKZIP", "CRC-32-PKZIP"],
|
104
|
+
[32, 0x04C11DB7, false, false, 0, ~0, 0xFC891918, "CRC-32-BZIP2", "CRC-32-AAL5", "CRC-32-DECT-B", "B-CRC-32"],
|
105
|
+
[32, 0x1EDC6F41, true, true, 0, ~0, 0xE3069283, "CRC-32C", "CRC-32-ISCSI", "CRC-32-CASTAGNOLI", "CRC-32-INTERLAKEN"],
|
106
|
+
[32, 0xa833982b, true, true, 0, ~0, 0x87315576, "CRC-32D"],
|
107
|
+
[32, 0x04C11DB7, false, false, ~0, 0, 0x0376E6E7, "CRC-32-MPEG-2"],
|
108
|
+
[32, 0x04C11DB7, false, false, ~0, ~0, 0x765E7680, "CRC-32-POSIX", "CKSUM"],
|
109
|
+
[32, 0x741B8CD7, true, true, 0, ~0, nil, "CRC-32K"],
|
110
|
+
[32, 0x32583499, true, true, 0, ~0, nil, "CRC-32K2"],
|
111
|
+
[32, 0x814141AB, false, false, 0, 0, 0x3010BF7F, "CRC-32Q"],
|
112
|
+
[32, 0x04C11DB7, true, true, ~0, 0, 0x340BC6D9, "JAMCRC", "CRC-32-JAMCRC"],
|
113
|
+
[32, 0x000000AF, false, false, 0, 0, 0xBD0BE338, "XFER", "CRC-32-XFER"],
|
114
|
+
[40, 0x0004820009, false, false, ~0, ~0, 0xD4164FC646, "CRC-40-GSM"],
|
115
|
+
[64, 0x42F0E1EBA9EA3693, true, true, 0, ~0, 0x995DC9BBDF1939FA, "CRC-64", "CRC-64-XZ"],
|
116
|
+
[64, 0x42F0E1EBA9EA3693, false, false, 0, 0, 0x6C40DF5F0B497347, "CRC-64-ECMA", "CRC-64-ECMA-182"],
|
117
|
+
[64, 0x42F0E1EBA9EA3693, false, false, 0, ~0, 0x62EC59E3F1A4F00A, "CRC-64-WE"],
|
118
|
+
[64, 0x000000000000001B, false, false, 0, 0, nil, "CRC-64-ISO"],
|
119
|
+
# [82, 0x308C0111011401440411, true, true, 0, 0, 0x9EA83F625023801FD612, "CRC-82/DARC"],
|
69
120
|
]
|
70
|
-
|
71
|
-
$stderr.puts "#{__FILE__}:#{__LINE__}: SELF CHECK for CRC modules (#{File.basename($".grep(/\/crc\/_(?:byruby|turbo)/)[0]||"")})\n" if SELF_TEST
|
72
|
-
list.each do |name, polynomial, bitsize, initial_state, refin, refout, xor, check, *names|
|
73
|
-
names.map! { |nm| nm.freeze }
|
74
|
-
|
75
|
-
crc = create_module(bitsize, polynomial, initial_state, refin, refout, xor, names[0])
|
76
|
-
|
77
|
-
const_set(name, crc)
|
78
|
-
names.each { |nm| MODULE_TABLE[nm.downcase.gsub(/[\W_]+/, "")] = crc }
|
79
|
-
|
80
|
-
check = Integer(check.to_i) if check
|
81
|
-
crc.const_set :CHECK, check
|
82
|
-
|
83
|
-
generator = crc::GENERATOR
|
84
|
-
define_singleton_method(name.downcase, ->(*args) { generator.crc(*args) })
|
85
|
-
define_singleton_method("#{name.downcase}_digest", ->(*args) { generator.digest(*args) })
|
86
|
-
define_singleton_method("#{name.downcase}_hexdigest", ->(*args) { generator.hexdigest(*args) })
|
87
|
-
|
88
|
-
if SELF_TEST
|
89
|
-
checked = generator.crc("123456789")
|
90
|
-
case
|
91
|
-
when check.nil?
|
92
|
-
$stderr.puts "| %20s(\"123456789\") = %16X (check only)\n" % [names[0], checked]
|
93
|
-
when check != checked
|
94
|
-
$stderr.puts "| %20s(\"123456789\") = %16X (expect to %016X)\n" % [names[0], checked, check]
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
exit if SELF_TEST
|
99
|
-
|
100
|
-
class << self
|
101
|
-
alias crc64 crc64_ecma
|
102
|
-
end
|
103
|
-
|
104
|
-
CRC64 = CRC64_ECMA
|
105
121
|
end
|
data/lib/crc/finder.rb
CHANGED
@@ -8,7 +8,11 @@ module CRC
|
|
8
8
|
end
|
9
9
|
bitmask = ~(~0 << bitsize0)
|
10
10
|
crc &= bitmask
|
11
|
-
|
11
|
+
results = []
|
12
|
+
poly = Array(polynomial)
|
13
|
+
#poly += poly.map { |po| Utils.bitreflect(po, bitsize0) }
|
14
|
+
#poly.uniq!
|
15
|
+
poly.each do |poly|
|
12
16
|
poly &= bitmask
|
13
17
|
[false, true].each do |refin|
|
14
18
|
[false, true].each do |refout|
|
@@ -17,13 +21,13 @@ module CRC
|
|
17
21
|
Array(initstate).each do |init|
|
18
22
|
init &= bitmask
|
19
23
|
mod = CRC.create_module(bitsize0, poly, init, refin, refout, xormask)
|
20
|
-
|
24
|
+
results << mod if mod.crc(seq) == crc
|
21
25
|
end
|
22
26
|
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
|
-
|
31
|
+
results
|
28
32
|
end
|
29
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dearblue
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -26,21 +26,24 @@ dependencies:
|
|
26
26
|
version: '11.0'
|
27
27
|
description: |
|
28
28
|
This is a general CRC (Cyclic Redundancy Check) generator for ruby.
|
29
|
-
It is written by pure ruby with based on slice-by-eight algorithm (byte-order
|
30
|
-
Included built-in CRC modules are CRC-32, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and more.
|
31
|
-
|
29
|
+
It is written by pure ruby with based on slice-by-eight algorithm (slice-by-16 algorithm as byte-order free and byte-alignment free).
|
30
|
+
Included built-in CRC modules are CRC-32, CRC-64-XZ, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and many more.
|
31
|
+
Additional your customized CRC modules are defined to posible.
|
32
32
|
If you need more speed, please use crc-turbo.
|
33
33
|
email: dearblue@users.osdn.me
|
34
34
|
executables: []
|
35
35
|
extensions: []
|
36
36
|
extra_rdoc_files:
|
37
|
+
- HISTORY.ja.md
|
37
38
|
- LICENSE
|
38
39
|
- README.md
|
39
40
|
- lib/crc.rb
|
40
41
|
- lib/crc/_byruby.rb
|
42
|
+
- lib/crc/_combine.rb
|
41
43
|
- lib/crc/_modules.rb
|
42
44
|
- lib/crc/finder.rb
|
43
45
|
files:
|
46
|
+
- HISTORY.ja.md
|
44
47
|
- LICENSE
|
45
48
|
- README.md
|
46
49
|
- Rakefile
|
@@ -48,11 +51,14 @@ files:
|
|
48
51
|
- gemstub.rb
|
49
52
|
- lib/crc.rb
|
50
53
|
- lib/crc/_byruby.rb
|
54
|
+
- lib/crc/_combine.rb
|
51
55
|
- lib/crc/_modules.rb
|
52
56
|
- lib/crc/finder.rb
|
53
57
|
homepage: https://osdn.jp/projects/rutsubo/
|
54
58
|
licenses:
|
55
59
|
- BSD-2-Clause
|
60
|
+
- Zlib
|
61
|
+
- CC0-1.0
|
56
62
|
metadata: {}
|
57
63
|
post_install_message:
|
58
64
|
rdoc_options:
|
@@ -74,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
80
|
version: '0'
|
75
81
|
requirements: []
|
76
82
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.6.
|
83
|
+
rubygems_version: 2.6.4
|
78
84
|
signing_key:
|
79
85
|
specification_version: 4
|
80
86
|
summary: general CRC generator
|