crc 0.3.1.1 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,114 @@
1
+ class CRC
2
+ #
3
+ # Utilities.
4
+ #
5
+ module Utils
6
+ extend self
7
+
8
+ def bitreflect_reference(num, bitsize)
9
+ n = 0
10
+ bitsize.times { n <<= 1; n |= (num & 0x01); num >>= 1 }
11
+ n
12
+ end
13
+
14
+ def bitreflect(num, bitsize)
15
+ case
16
+ when bitsize > 128
17
+ bitreflect_reference(num, bitsize)
18
+ when bitsize > 64
19
+ bitreflect128(num) >> (128 - bitsize)
20
+ when bitsize > 32
21
+ bitreflect64(num) >> (64 - bitsize)
22
+ when bitsize > 16
23
+ bitreflect32(num) >> (32 - bitsize)
24
+ when bitsize > 8
25
+ bitreflect16(num) >> (16 - bitsize)
26
+ else
27
+ bitreflect8(num) >> (8 - bitsize)
28
+ end
29
+ end
30
+
31
+ def build_table(bitsize, polynomial, unfreeze = false, slice: 16)
32
+ bitmask = ~(~0 << bitsize)
33
+ table = []
34
+ Aux.slide_to_head(bitsize, 0, bitmask & polynomial, bitmask) do |xx, poly, csh, head, carries, pad|
35
+ table << (t = [])
36
+ 256.times do |b|
37
+ b <<= csh
38
+ 8.times { b = (b[head] == 0) ? (b << 1) : (((carries & b) << 1) ^ poly) }
39
+ t << b
40
+ end
41
+ t.freeze unless unfreeze
42
+
43
+ carries8 = carries >> 7
44
+ (1...slice).step do
45
+ tt = table[-1]
46
+ table << (t = [])
47
+ 256.times do |b|
48
+ t << (table[0][tt[b] >> csh] ^ ((carries8 & tt[b]) << 8))
49
+ end
50
+ t.freeze unless unfreeze
51
+ end
52
+ 0
53
+ end
54
+ table.freeze unless unfreeze
55
+ table
56
+ end
57
+
58
+ def build_reflect_table(bitsize, polynomial, unfreeze = false, slice: 16)
59
+ polynomial = bitreflect(polynomial, bitsize)
60
+ table = []
61
+
62
+ table << (t = [])
63
+ 256.times do |b|
64
+ 8.times { b = (b[0] == 0) ? (b >> 1) : ((b >> 1) ^ polynomial) }
65
+ t << b
66
+ end
67
+ t.freeze unless unfreeze
68
+
69
+ (1...slice).step do
70
+ tt = table[-1]
71
+ table << (t = [])
72
+ 256.times do |b|
73
+ t << (table[0][tt[b] & 0xff] ^ (tt[b] >> 8))
74
+ end
75
+ t.freeze unless unfreeze
76
+ end
77
+
78
+ table.freeze unless unfreeze
79
+ table
80
+ end
81
+
82
+ def export_table(table, bitsize, linewidth, indentsize = 2)
83
+ bitsize0 = bitsize.to_i
84
+ indent = " " * indentsize.to_i
85
+ case
86
+ when bitsize0 > 64 || bitsize0 < 1
87
+ raise "invalid bitsize (expected to 1..64, but given #{bitsize})"
88
+ when bitsize0 > 32
89
+ packformat = "Q>"
90
+ hexwidth = 16
91
+ when bitsize0 > 16
92
+ packformat = "N"
93
+ hexwidth = 8
94
+ when bitsize0 > 8
95
+ packformat = "n"
96
+ hexwidth = 4
97
+ else # when bitsize0 > 0
98
+ packformat = "C"
99
+ hexwidth = 2
100
+ end
101
+ table = table.to_a.pack("#{packformat}*").unpack("H*")[0]
102
+ table.gsub!(/(?<=\w)(?=\w{#{hexwidth}}{#{linewidth}}+$)/, "\n")
103
+ table.gsub!(/(?<=\w)(?=\w{#{hexwidth}}+$)/, " ")
104
+ table.gsub!(/(?<=\w)(?=\s|$)/, ",")
105
+ table.gsub!(/(?:(?<=^)|(?<=\s))(?=\w)/, "0x")
106
+ table.gsub!(/^/, "#{indent} ")
107
+ <<-EOS
108
+ #{indent}TABLE = [
109
+ #{table}
110
+ #{indent}].freeze
111
+ EOS
112
+ end
113
+ end
114
+ end
@@ -3,17 +3,17 @@
3
3
  require_relative "../crc"
4
4
 
5
5
  class CRC
6
- module ModuleClass
6
+ using CRC::Extensions
7
+
8
+ module Calcurator
7
9
  #
8
10
  # call-seq:
9
- # acrc(crc, rest_seq = nil, target_crc = 0) -> byte string as arc-code
11
+ # acrc(pre, post = nil, targetcrc = 0) -> byte string as arc-code
10
12
  #
11
13
  # 目的となる crc になるように、指定された crc に続くバイト列を逆算します。
12
14
  #
13
15
  # 出力されるバイト列は、crc のビット数を表現できるバイト数となります。
14
16
  #
15
- # 現在のところ、reflect-input/output 限定となっています。
16
- #
17
17
  # * crc32("123456789????") の結果が 0 となるような、???? の部分を逆算する
18
18
  #
19
19
  # seq = "123456789"
@@ -31,75 +31,20 @@ class CRC
31
31
  #
32
32
  # seq1 = "123456789"
33
33
  # seq2 = "ABCDEFG"
34
- # target_crc = 0x12345678
35
- # seq = seq1 + CRC::CRC32.acrc(seq1, seq2, target_crc) + seq2
34
+ # targetcrc = 0x12345678
35
+ # seq = seq1 + CRC::CRC32.acrc(seq1, seq2, targetcrc) + seq2
36
36
  # p CRC::CRC32[seq] # => #<CRC::CRC32:12345678>
37
37
  #
38
- def acrc(crc, rest_seq = nil, target_crc = 0)
39
- raise NotImplementedError, "crc polynomial is not odd" unless polynomial.odd?
40
- raise NotImplementedError, "crc module is not reflect input and output" unless reflect_input? && reflect_output?
41
-
42
- bitsize = self.bitsize
43
- poly = CRC.bitreflect(polynomial, bitsize)
44
- target_crc = target_crc.to_i
45
- target_crc ^= xor_output
46
-
47
- if rest_seq
48
- rest_seq.bytesize.downto(1) do |i|
49
- target_crc = Aux.acrc_loop_reflect(target_crc, rest_seq.getbyte(i - 1), poly, bitsize, 0xff, 8)
50
- end
51
- end
52
-
53
- bytes = (bitsize + 7) / 8
54
- bits = bytes * 8
55
-
56
- case crc
57
- when Numeric
58
- state = bitmask & crc ^ xor_output
59
- when CRC
60
- raise "different crc module (given %p(%p), expect %p)" % [crc, crc.class, self] unless variant?(crc)
61
- state = crc.state
62
- else
63
- state = new(crc).state
64
- end
65
-
66
- if bits > bitsize
67
- # ビット数が 8 の境界にない場合、その隙間分を埋める。
68
- # 現在の実装では、最終結果のバイト列における最終バイト値の
69
- # 上位ビットが 0 であるようにしている。
70
- pad = bits - bitsize
71
- target_crc = Aux.acrc_loop_reflect(target_crc, 0, poly, bitsize, 0xff, pad)
72
- end
73
-
74
- target_crc = Aux.acrc_loop_reflect(target_crc, state, poly, bitsize, bitmask, bitsize)
75
-
76
- bytes.times.reduce("") { |a, *| a << (target_crc & 0xff).chr(Encoding::BINARY); target_crc >>= 8; a }
77
- end
78
- end
79
-
80
- module Aux
81
- def self.acrc_loop_reflect(target_crc, state, poly, crcbits, bitmask, bits)
82
- head = bits - 1
83
- bitmask1 = bitmask >> 1
84
- crchead = crcbits - 1
85
-
86
- #puts "target_crc=0b%016b, state=0b%016b, reversed-polynomial=0b%016b" % [target_crc, state, poly]
87
- bits.times do |i|
88
- if target_crc[crchead] == 0
89
- target_crc <<= 1
90
- else
91
- target_crc ^= poly
92
- target_crc <<= 1
93
- target_crc |= 0x01
94
- end
95
-
96
- target_crc ^= state[head]
97
- #puts " 0_%016b ^ %d" % [target_crc, state[head]]
98
- state = (state & bitmask1) << 1
99
- end
100
- #puts "target_crc=0b%016b" % target_crc
101
-
102
- target_crc
38
+ def acrc(pre, post = nil, targetcrc = 0)
39
+ pre = pre.convert_internal_state_for(self)
40
+ laststate = targetcrc.convert_target_state_for(self)
41
+ state = unshiftbytes(post, laststate)
42
+ bytesize = (bitsize + 7) / 8
43
+ pre <<= (bytesize * 8 - bitsize) unless reflect_input?
44
+ bytes = pre.splitbytes("".b, bytesize, reflect_input?)
45
+ state = unshiftbytes(bytes, state)
46
+ state <<= (bytesize * 8 - bitsize) unless reflect_input?
47
+ state.splitbytes("".b, bytesize, reflect_input?)
103
48
  end
104
49
  end
105
50
  end
@@ -854,7 +854,7 @@ end
854
854
  raise ArgumentError, "out of algorithm code (given #{algorithm})"
855
855
  end
856
856
  (<<-EOS).gsub!(/^(?!$)/, " ").gsub!(/^/) { line_prefix }.chomp!
857
- A CRC generator for #{crcname}.
857
+ A CRC calculator for #{crcname}.
858
858
 
859
859
  This code is auto generated by <https://rubygems.org/gems/crc>.
860
860
 
@@ -1,5 +1,5 @@
1
1
  #!ruby
2
2
 
3
3
  class CRC
4
- VERSION = "0.3.1.1"
4
+ VERSION = "0.4"
5
5
  end
@@ -0,0 +1,23 @@
1
+ #!ruby
2
+
3
+ require "test-unit"
4
+ require "crc"
5
+ require "optparse"
6
+
7
+ alltest = false
8
+ opt = OptionParser.new(nil, 12, " ")
9
+ opt.instance_eval do
10
+ on("--all", "test all crc modules") { alltest = true }
11
+ order!
12
+ end
13
+
14
+ if alltest
15
+ $testmodules = CRC::MODULE_TABLE.values.uniq
16
+ else
17
+ $testmodules = %w(
18
+ CRC-32 CRC-32-POSIX CRC-64 CRC-64-ECMA
19
+ CRC-3-ROHC CRC-5-USB CRC-7-ROHC CRC-7-UMTS CRC-8-CCITT CRC-8-MAXIM
20
+ CRC-15 CRC-16 CRC-16-XMODEM CRC-24-OPENPGP CRC-24-BLE CRC-31-PHILIPS
21
+ ).map { |e| CRC[e] }
22
+ end
23
+
@@ -0,0 +1,31 @@
1
+ require "crc"
2
+
3
+ $stderr.puts "#{__FILE__}:#{__LINE__}: SELF CHECK for CRC modules (#{File.basename($".grep(/_(?:byruby|turbo)/)[0]||"")})\n"
4
+
5
+ class CRC
6
+ MODULE_TABLE.values.uniq.each do |crc|
7
+ check = crc::CHECK
8
+ checked = crc.crc("123456789")
9
+ case check
10
+ when nil
11
+ $stderr.puts "| %20s(\"123456789\" * 1) = %16X (check only)\n" % [crc.name, checked]
12
+ when checked
13
+ ;
14
+ else
15
+ $stderr.puts "| %20s(\"123456789\" * 1) = %16X (expect to %X)\n" % [crc.name, checked, check]
16
+ end
17
+
18
+ check = 9.times.reduce(crc.new) { |a, x| a + crc.new(crc::CHECK, 9) }
19
+ checked = crc["123456789" * 9]
20
+ case check
21
+ when nil
22
+ $stderr.puts "| %20s(\"123456789\" * 9) = %16X (check only)\n" % [crc.name, checked]
23
+ when checked
24
+ ;
25
+ else
26
+ $stderr.puts "| %20s(\"123456789\" * 9) = %16X (expect to %X)\n" % [crc.name, checked, check]
27
+ end
28
+ end
29
+ end
30
+
31
+ $stderr.puts "#{__FILE__}:#{__LINE__}: DONE SELF CHECK\n"
@@ -0,0 +1,28 @@
1
+ #!ruby
2
+
3
+ require "test-unit"
4
+ require "crc"
5
+ require_relative "common"
6
+
7
+ class TestCRC < Test::Unit::TestCase
8
+ $testmodules.each do |crc|
9
+ next unless crc.const_defined?(:CHECK) && crc::CHECK
10
+ class_eval(<<-"EOS", __FILE__, __LINE__ + 1)
11
+ def test_block_#{crc.to_s.slice(/\w+$/)}
12
+ assert_equal(#{crc}::CHECK, #{crc}.crc("123456789"))
13
+ end
14
+
15
+ def test_stream_#{crc.to_s.slice(/\w+$/)}
16
+ s = #{crc}.new
17
+ s << "123456789"
18
+ assert_equal(#{crc}::CHECK, s.crc)
19
+ end
20
+
21
+ def test_stream2_#{crc.to_s.slice(/\w+$/)}
22
+ s = #{crc}.new
23
+ "123456789".each_char { |ch| s << ch }
24
+ assert_equal(#{crc}::CHECK, s.crc)
25
+ end
26
+ EOS
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ #!ruby
2
+
3
+ require "test-unit"
4
+ require "crc"
5
+ require_relative "common"
6
+
7
+ class TestCRCMagic < Test::Unit::TestCase
8
+ $testmodules.each do |crc|
9
+ next unless crc.const_defined?(:CHECK) && crc::CHECK
10
+ name = crc.to_s.slice(/\w+$/)
11
+ class_eval(<<-"TESTCODE", __FILE__, __LINE__ + 1)
12
+ def test_magic_#{name}
13
+ assert_equal #{crc}.magic, #{crc}.hexdigest(#{crc}.magicdigest(""))
14
+ assert_equal #{crc}.magic, #{crc}.hexdigest("A" + #{crc}.magicdigest("A"))
15
+ assert_equal #{crc}.magic, #{crc}.hexdigest("A" * 100 + #{crc}.magicdigest("A" * 100))
16
+ end
17
+
18
+ def test_magicnumber_#{name}
19
+ assert_equal #{crc}.magicnumber, #{crc}.crc(#{crc}.magicdigest(""))
20
+ assert_equal #{crc}.magicnumber, #{crc}.crc("A" + #{crc}.magicdigest("A"))
21
+ assert_equal #{crc}.magicnumber, #{crc}.crc("A" * 100 + #{crc}.magicdigest("A" * 100))
22
+ end
23
+ TESTCODE
24
+ end
25
+ end
metadata CHANGED
@@ -1,34 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1.1
4
+ version: '0.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - dearblue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-10 00:00:00.000000000 Z
11
+ date: 2017-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '11'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '11'
26
+ version: '0'
27
27
  description: |
28
- Pure ruby implemented general CRC (Cyclic Redundancy Check) generator.
28
+ Pure ruby implemented general CRC (Cyclic Redundancy Check) calcurator.
29
29
  Customization is posible for 1 to 64 bit width, any polynomials, and with/without bit reflection input/output.
30
30
  If you need more speed, please use crc-turbo.
31
- email: dearblue@users.osdn.me
31
+ email: dearblue@users.noreply.github.com
32
32
  executables:
33
33
  - rbcrc
34
34
  extensions: []
@@ -37,9 +37,15 @@ extra_rdoc_files:
37
37
  - LICENSE
38
38
  - README.md
39
39
  - lib/crc.rb
40
+ - lib/crc/_aux.rb
40
41
  - lib/crc/_byruby.rb
41
42
  - lib/crc/_combine.rb
43
+ - lib/crc/_extensions.rb
44
+ - lib/crc/_file.rb
45
+ - lib/crc/_magic.rb
42
46
  - lib/crc/_modules.rb
47
+ - lib/crc/_shift.rb
48
+ - lib/crc/_utils.rb
43
49
  - lib/crc/acrc.rb
44
50
  - lib/crc/codegen.rb
45
51
  - lib/crc/finder.rb
@@ -53,14 +59,24 @@ files:
53
59
  - bin/rbcrc
54
60
  - gemstub.rb
55
61
  - lib/crc.rb
62
+ - lib/crc/_aux.rb
56
63
  - lib/crc/_byruby.rb
57
64
  - lib/crc/_combine.rb
65
+ - lib/crc/_extensions.rb
66
+ - lib/crc/_file.rb
67
+ - lib/crc/_magic.rb
58
68
  - lib/crc/_modules.rb
69
+ - lib/crc/_shift.rb
70
+ - lib/crc/_utils.rb
59
71
  - lib/crc/acrc.rb
60
72
  - lib/crc/codegen.rb
61
73
  - lib/crc/finder.rb
62
74
  - lib/crc/version.rb
63
- homepage: https://osdn.jp/projects/rutsubo/
75
+ - test/common.rb
76
+ - test/self_check.rb
77
+ - test/test_block.rb
78
+ - test/test_magic.rb
79
+ homepage: https://github.com/dearblue/ruby-crc-turbo
64
80
  licenses:
65
81
  - BSD-2-Clause
66
82
  - Zlib
@@ -78,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
78
94
  requirements:
79
95
  - - ">="
80
96
  - !ruby/object:Gem::Version
81
- version: '2.0'
97
+ version: '2.2'
82
98
  required_rubygems_version: !ruby/object:Gem::Requirement
83
99
  requirements:
84
100
  - - ">="
@@ -86,8 +102,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
102
  version: '0'
87
103
  requirements: []
88
104
  rubyforge_project:
89
- rubygems_version: 2.6.4
105
+ rubygems_version: 2.6.10
90
106
  signing_key:
91
107
  specification_version: 4
92
- summary: general CRC generator
108
+ summary: general CRC calcurator
93
109
  test_files: []