crc 0.3 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0e420d67c8c057164c47f3fd4a1d6096d28f66a2
4
- data.tar.gz: 77ec3196b4ba3164e0659fcffa7a9833e162aa0c
2
+ SHA256:
3
+ metadata.gz: 0b6f6d28a243bad0ffb9e82e9aee4209345b284cd82433783da10a2ebe60c049
4
+ data.tar.gz: e7c0aea67d734fc21567428df2d46047e2d8484d1f6147dbafcd4f9d280d8466
5
5
  SHA512:
6
- metadata.gz: 7b313c40122e1ee2d953e8fe07520f7787bbea4af884de0fcea1b92263b4791ed189b70696b8885d19bbf33fb56fdcf0f12412a44ade7e2a5f6f91e57d946421
7
- data.tar.gz: 157a966f25728523a2edb3de9bf293f0af0bbc1e6484a0bc7b5db8548f6a34abdb5c599d532c5e7b5a119bd41174161517b81d0cf75c49cccdf2596619adfdb8
6
+ metadata.gz: '02249a8be40ac1ec6590841b217aec8f4cc0f5a5fddd1f563e573820bc50094320aed04b03ebcdcf93e0c4b85d19da8fe0973eaa6f3c586da3702a69ab6f7c08'
7
+ data.tar.gz: 9b5885a2b02026dc254953ce93024b5a8ac69e576698c6f4a8a42b0b93062bb5011d7c6478498c3bee6635b8a185b795f559591970f122ca81c6e68d7d32b2fb
@@ -2,6 +2,91 @@ This document is written in Japanese.
2
2
 
3
3
  # crc for ruby の更新履歴
4
4
 
5
+ ## crc-0.4.2 (令和2年9月20日 日曜日)
6
+
7
+ * "CRC Module" は "CRC Model" とするべきなので修正
8
+ * 初期値の間違っていた CRC モデルがあったため修正
9
+ * "calcurator" は "calculator" の誤植なので修正 (thanks @stbnrivas [#2](https://github.com/dearblue/ruby-crc/pull/2))
10
+ * 間違ったリンクの修正 (thanks @simi [#1](https://github.com/dearblue/ruby-crc/pull/1))
11
+
12
+
13
+ ## crc-0.4.1 (平成29年4月1日 土曜日)
14
+
15
+ * rbcrc -lvv の表示に、ビット反転多項式、相反多項式、初期内部状態、ビット反転魔法数を追加
16
+ * ``dump_to_c`` に slicing-by-2 から slicing-by-999 までの出力機能を追加
17
+
18
+
19
+ ## crc-0.4.0.1 (平成29年3月28日 火曜日)
20
+
21
+ * acrc、shift 系メソッドのバグ修正
22
+
23
+
24
+ ## crc-0.4 (平成29年3月5日 日曜日)
25
+
26
+ ***互換性を損なう変更があります。***
27
+
28
+ * **[互換性を損なう変更]** CRC.new と CRC.[] の役割を分担
29
+
30
+ * これまで CRC をサブクラスとしたクラスメソッド CRC.new と CRC.[] は全く同じ挙動をしていましたが、役割を分担しました。
31
+
32
+ ``CRC.new`` は初期化のためのメソッドとし、``CRC.[]`` は CRC インスタンスを返す ``CRC.crc`` のようなメソッドとなるようにしました。
33
+
34
+ * ``CRC.new(seq, ...)`` の形では呼び出せなくなりました。
35
+
36
+ * ``CRC.[](seq, ...)`` の seq は必須としました。
37
+
38
+ * **[互換性を損なう変更]** bin/rbcrc のオプション名を変更
39
+
40
+ * ``-M`` および ``-N`` オプションをそれぞれ小文字に変更しました。
41
+
42
+ * ``CRC.file`` 及び ``CRC#file`` メソッドの追加
43
+
44
+ * ファイルパスを与えると CRC を計算してインスタンスを返す ``CRC.file`` 及び ``CRC#file`` を追加しました。
45
+
46
+ * ``CRC.magic``、``CRC.magicnumber``、``CRC.magicdigest``、``CRC.to_magicdigest``、``CRC#magicdigest`` メソッドの追加
47
+
48
+ * マジックナンバーを取得・計算するためのメソッドを追加しました。
49
+
50
+ これらは CRC-32 の場合であれば RFC1570 で出てくるマジックナンバー 0xdebb20e3 のことです。
51
+
52
+ * 任意の CRC 値から逆算してバイト列を生成する機能 CRC.acrc (crc/acrc.rb) を正式に追加
53
+
54
+ * crc-0.3 で実験的に追加された同機能を、正式なものとしました。
55
+
56
+ この機能は入出力の正順・逆順に関わらずに利用可能です。
57
+
58
+ * ``CRC.shiftbits`` ``CRC.shiftbytes`` ``CRC.unshiftbits`` ``CRC.unshiftbytes`` を追加
59
+
60
+ * 任意長のビット列を与えて内部状態を更新する ``CRC.shiftbits`` を追加しました。
61
+
62
+ * 任意長の8ビット列を与えて内部状態を更新する ``CRC.shiftbytes`` を追加しました。
63
+ * ``CRC.update`` とは異なり、整数値で構成される配列を渡すことが出来ます。
64
+
65
+ * 任意長のビット列を与えて内部状態を差し戻す ``CRC.unshiftbits`` を追加しました。
66
+
67
+ * 任意長の8ビット列を与えて内部状態を差し戻す ``CRC.unshiftbytes`` を追加しました。
68
+
69
+ * **[BUG FIX]** 入出力のビット送り方向が異なる場合、CRC.reset が不正な初期化を行っていた問題を修正
70
+
71
+
72
+ ## crc-0.3.1.1 (平成28年11月10日 木曜日)
73
+
74
+ * rbcrc において reflect-input/output が既定値となっていなかったため修正
75
+
76
+
77
+ ## crc-0.3.1 (平成28年11月10日 木曜日)
78
+
79
+ * メソッド名 CRC#update\_with\_slice\_by\_eight を CRC#update\_with\_slice\_by\_16 に変更
80
+ * 非 reflect-input も slicing-by-16 となるように修正
81
+ * CRC#update\_with\_slice\_by\_16 の 16 ビット以下の crc に対する最適化
82
+ * crc 計算におけるルックアップテーブルの作成の高速化
83
+ * 実装が C か ruby かを判別しやすくするための定数 CRC::IMPLEMENT を追加
84
+ * CRC-64-JONES を追加
85
+ * 特定の CRC を計算するソースコード出力機能を追加
86
+ * c、ruby、javascript 向けのソースコードを出力するための機能を追加しました。
87
+ * 今のところアルゴリズムは c を除き slicing-by-16 に固定となります。
88
+
89
+
5
90
  ## crc-0.3 (平成28年7月31日 日曜日)
6
91
 
7
92
  互換性を損なう変更があります。
@@ -0,0 +1,281 @@
1
+
2
+ # crc - CRC calcurator for ruby
3
+
4
+ これは Ruby 向けの汎用 CRC (巡回冗長検査; Cyclic Redundancy Check) 算出器です。
5
+
6
+ “Slicing by 8” アルゴリズムを基にした“バイトオーダーフリーの Slicing by 16 アルゴリズム” を 100% Ruby で記述しています。
7
+
8
+ CRC モデルとして CRC-32、CRC-32C、CRC-64-XZ、CRC-16、CRC-8-MAXIM、CRC-5-USB ほか多数が最初から組み込まれています。
9
+
10
+ 利用者は、1〜64のビット幅、任意の多項式、および入出力のビット反射の有無に関してカスタマイズが可能です。
11
+
12
+ このライブラリは FreeBSD 10.3R amd64 上の zlib の `crc32()` よりも 85倍以上遅く、liblzma の `crc32()` よりも 120倍以上低速です。
13
+
14
+ さらに速度が必要な場合は、[crc-turbo](https://rubygems.org/gems/crc-turbo) と併用してください。
15
+
16
+
17
+ ## API Guide
18
+
19
+ この例は CRC-32 モデル (`CRC::CRC32` クラス) を使用しています。
20
+ 他の CRC モデルについては脳内変換して下さい。
21
+
22
+ ### 即時的算出
23
+
24
+ * `CRC.crc32(seq, init = CRC::CRC32.initial_crc) => crc-32 integer` (likely as `Zlib.crc32`)
25
+ * `CRC.crc32.crc(seq, init = CRC::CRC32.initial_crc) => crc-32 integer` (likely as `Zlib.crc32`)
26
+ * `CRC.crc32.digest(seq, init = CRC::CRC32.initial_crc) => crc-32 digest` (likely as `Digest::XXXX.digest`)
27
+ * `CRC.crc32.hexdigest(seq, init = CRC::CRC32.initial_crc) -> crc-32 hex-digest` (likely as `Digest::XXXX.hexdigest`)
28
+ * `CRC.crc32[seq, init = CRC::CRC32.initial_crc, current_length = 0] -> crc-32 calcurator`
29
+
30
+ ### 段階的算出 (ストリーミング)
31
+
32
+ * `CRC.crc32.new(init = 0, current_length = 0) => crc-32 calcurator`
33
+ * `CRC::CRC32#update(seq) => self` (likely as `Digest::XXXX.update`)
34
+ * `CRC::CRC32#finish => crc-32 integer` (likely as `Digest::XXXX.finish`)
35
+ * `CRC::CRC32#crc => crc-32 integer` (same as `CRC::CRC32#finish`)
36
+ * `CRC::CRC32#digest => crc-32 digest` (likely as `Digest::XXXX.digest`)
37
+ * `CRC::CRC32#hexdigest => crc-32 hex-digest` (likely as `Digest::XXXX.hexdigest`)
38
+
39
+ #### 例
40
+
41
+ ``` ruby:ruby
42
+ x = CRC.crc32.new # => #<CRC::CRC32:00000000>
43
+ x.update "123" # => #<CRC::CRC32:884863D2>
44
+ x.update "456789" # => #<CRC::CRC32:CBF43926>
45
+ x.crc # => 3421780262
46
+ x.digest # => "\xCB\xF49&"
47
+ x.hexdigest # => "CBF43926"
48
+ ```
49
+
50
+ ### CRC 値の結合
51
+
52
+ - `CRC.combine(crc1, crc2, len2) => combined crc integer` (likely as `Zlib.crc32_comibne`)
53
+ - `CRC#+(right_crc) => combined crc calcurator`
54
+
55
+ `CRC.combine` は Mark Adler 氏による crccomb.c (<https://stackoverflow.com/questions/29915764/generic-crc-8-16-32-64-combine-implementation#29928573>) をそっくり~~パクった~~移植したものです。
56
+
57
+ #### 例1
58
+
59
+ ``` ruby:ruby
60
+ CRC.crc32.combine(CRC.crc32("123"), CRC.crc32("456789"), 6) # => 3421780262
61
+ ```
62
+
63
+ #### 例2
64
+
65
+ ``` ruby:ruby
66
+ CRC.crc32["123"] + CRC.crc32["456"] + CRC.crc32["789"] # => #<CRC::CRC32:CBF43926>
67
+ ```
68
+
69
+ ### 利用者定義 CRC モデルの生成
70
+
71
+ * `CRC.new(bitsize, poly, initial_crc = 0, refin = true, refout = true, xor_output = ~0) => new crc model class`
72
+
73
+ #### 例
74
+
75
+ ``` ruby:ruby
76
+ MyCRC32 = CRC.new(32, 0x04C11DB7)
77
+ MyCRC32.class # => Class
78
+ MyCRC32.hexdigest("123456789") # => "CBF43926"
79
+ MyCRC32["123456789"] # => #<MyCRC32:CBF43926>
80
+ ```
81
+
82
+ ### 逆進 CRC 値の算出
83
+
84
+ - `CRC::XXX.acrc(pre, post = nil, want_crc = 0) => arc-crc byte string`
85
+
86
+ #### 例
87
+
88
+ ``` ruby:ruby
89
+ a = "12"
90
+ c = "789"
91
+ wantcrc = CRC.crc32("123456789")
92
+ b = CRC.crc32.acrc(a, c, wantcrc) # => "3456"
93
+ CRC.crc32[a + b + c] # => #<CRC::CRC32:CBF43926>
94
+ ```
95
+
96
+ See CRC::Calcurate.acrc or below for more detail.
97
+
98
+
99
+ ## 組み込み CRC モデル
100
+
101
+ ```
102
+ $ rbcrc -lq
103
+ ```
104
+
105
+ 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-ROHC, CRC-7-UMTS, 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, CRC-16, 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-16-A, CRC-16-KERMIT, CRC-16-MODBUS, CRC-16-X-25, CRC-16-XMODEM, 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-CDMA, CRC-31-PHILIPS, CRC-32, CRC-32-BZIP2, CRC-32C, CRC-32D, CRC-32-MPEG-2, CRC-32-POSIX, CRC-32Q, CRC-32-JAMCRC, CRC-32-XFER, CRC-40-GSM, CRC-64-XZ, CRC-64-JONES, CRC-64-ECMA, CRC-64-WE, CRC-64-ISO
106
+
107
+
108
+ ## 環境変数
109
+
110
+ ### `RUBY_CRC_NOFAST`
111
+
112
+ 内部処理の実装を変更します。
113
+
114
+ - `RUBY_CRC_NOFAST=0`: 可能であれば "crc-turbo" を使います。ライブラリの読み込みが出来なければ、`RUBY_CRC_NOFAST=1` と同じ挙動になります。
115
+ - `RUBY_CRC_NOFAST=1`: Ruby で実装された“Slicing by 16”アルゴリズムの仕様を強制します。"crc-turbo" は使われません。
116
+ - `RUBY_CRC_NOFAST=2`: Dilip V. Sarwate 氏によるテーブルアルゴリズムに切り替えます。52% ほどに低速となります (CRC-32 の場合)。
117
+ - `RUBY_CRC_NOFAST=3`: ビット単位の計算アルゴリズムに切り替えます。`RUBY_CRC_NOFAST=1` と比較して 7% ほどに低速となります (CRC-32 の場合)。
118
+
119
+
120
+ ## Source code generator for the specific CRC calcurator (from crc-0.3.1)
121
+
122
+ C・Ruby・javascript 向けの特化した CRC 算出器のソースコード生成機能があります。
123
+
124
+ アルゴリズムは Ruby および javascript の場合は“Slicing by 16”に限定されます。
125
+
126
+ Cの場合は、bit-by-bit, bit-by-bit-fast, halfbyte-table, standard-table, slicing-by-4, slicing-by-8, and slicing-by-16 を選択できます。
127
+
128
+ ```
129
+ $ rbcrc --help
130
+ usage: rbcrc [options] output-filename...
131
+ -m crcname choose included crc name in library (``-l'' to print list)
132
+ -n crcname declare function name or class name [DEFAULT is filename]
133
+ -s bitsize declare crc bit size [REQUIRED for customized crc]
134
+ -p polynom declare crc polynomial [REQUIRED for customized crc]
135
+ -c initcrc declare initial crc (not internal state) [DEFAULT: 0]
136
+ -S initstate declare initial state (internal state) [DEFAULT: unset]
137
+ -x xormask declare xor bit mask for when output [DEFAULT: ~0]
138
+ -i reflect input [DEFAULT]
139
+ -I normal input (not reflect)
140
+ -o reflect output [DEFAULT]
141
+ -O normal output (not reflect)
142
+ -a algorithm switch algorithm (see below) (C file type only)
143
+
144
+ -l print crc names
145
+ -f force overwrite
146
+ -v increment verbosery level
147
+ -q quiet mode (reset verbosery level to zero)
148
+
149
+ About LICENSE for generated source code:
150
+ Generated code is under Creative Commons License Zero (CC0 / Public Domain).
151
+ See https://creativecommons.org/publicdomain/zero/1.0/
152
+
153
+ Algorithms (C file type only):
154
+ bit-by-bit, bit-by-bit-fast, halfbyte-table, standard-table,
155
+ slicing-by-4, slicing-by-8, slicing-by-16, slicing-by-{2..999}
156
+
157
+ Support export file types:
158
+ * .c for C (support C89, but required ``stdint.h'')
159
+ * .js for javascript (required ECMAScript 6th edition)
160
+ * .rb for ruby (for ruby-2.1+, jruby, and rubinius)
161
+ (executable for ruby-1.8, ruby-1.9 and ruby-2.0)
162
+ (executable for mruby and limitation bitsize by fixnum)
163
+
164
+ examples:
165
+ * create crc-32 calcurator to c source (and header file)
166
+ $ rbcrc crc32.c
167
+
168
+ * create crc-32c calcurator to ruby source
169
+ $ rbcrc crc32c.rb
170
+
171
+ * create crc-30-cdma calcurator to javascript source
172
+ $ rbcrc crc30cdma.js
173
+
174
+ * create crc-32 calcurator to ``crc.c'', ``crc.rb'' and ``crc.js''
175
+ $ rbcrc -mcrc32 crc.c crc.rb crc.js
176
+
177
+ * create customized crc calcurator (as mycrc function) to ``mycrc.c''
178
+ $ rbcrc -s15 -p0x6789 -io -x~0 mycrc.c
179
+
180
+ * create customized crc calcurator (as MyCRC class) to ``mycrc_1.rb''
181
+ $ rbcrc -s39 -p0x987654321 -IO -x1 -nMyCRC mycrc_1.rb
182
+ ```
183
+
184
+ - - - -
185
+
186
+ また、このコマンドには各 CRC 仕様を YAML 形式で出力する機能もあります。
187
+
188
+ ``` text
189
+ $ rbcrc -lvv
190
+ ...snip...
191
+ "CRC-32":
192
+ bitsize: 32
193
+ polynomial: 0x04C11DB7 # 0xEDB88320 (bit reflected)
194
+ reversed reciprocal: 0x82608EDB # 0xDB710641 (bit reflected)
195
+ reflect input: true
196
+ reflect output: true
197
+ initial crc: 0x00000000 # 0xFFFFFFFF (initial state)
198
+ xor output: 0xFFFFFFFF
199
+ magic number: 0x2144DF1C # 0xDEBB20E3 (internal state)
200
+ another names:
201
+ - "CRC-32-ADCCP"
202
+ - "CRC-32-PKZIP"
203
+ - "PKZIP"
204
+ ...snip...
205
+ ```
206
+
207
+
208
+ ## CRC の逆算 (arc-crc)
209
+
210
+ crc-0.4 にて、任意の CRC となるバイト列を逆算する機能が正式に追加されました。
211
+
212
+ `require "crc/acrc"` にて、その機能が利用可能となります。
213
+
214
+ 名前の由来は、arc-sin などの C 関数である asin と同様に、arc-crc => acrc となっています。
215
+
216
+ 以下は使用例です。
217
+
218
+ * 文字列 "123456789????" を CRC32 した場合に 0 となるような、???? の部分を逆算する
219
+
220
+ ``` ruby:ruby
221
+ require "crc/acrc"
222
+
223
+ seq = "123456789"
224
+ seq << CRC.crc32.acrc(seq)
225
+ p CRC.crc32[seq] # => #<CRC::CRC32:00000000>
226
+ ```
227
+
228
+ * 文字列 "123456789????ABCDEFG" の、???? の部分を逆算する
229
+
230
+ ``` ruby:ruby
231
+ require "crc/acrc"
232
+
233
+ seq1 = "123456789"
234
+ seq2 = "ABCDEFG"
235
+ seq = seq1 + CRC.crc32.acrc(seq1, seq2) + seq2
236
+ p CRC.crc32[seq] # => #<CRC::CRC32:00000000>
237
+ ```
238
+
239
+ * 文字列 "123456789????ABCDEFG" を CRC32 した場合に 0x12345678 となるような、???? の部分を逆算する
240
+
241
+ ``` ruby:ruby
242
+ require "crc/acrc"
243
+
244
+ seq1 = "123456789"
245
+ seq2 = "ABCDEFG"
246
+ target_crc = 0x12345678
247
+ seq = seq1 + CRC.crc32.acrc(seq1, seq2, target_crc) + seq2
248
+ p CRC.crc32[seq] # => #<CRC::CRC32:12345678>
249
+ ```
250
+
251
+ * 独自仕様の CRC モジュールにも対応
252
+
253
+ ``` ruby:ruby
254
+ require "crc/acrc"
255
+
256
+ seq1 = "123456789"
257
+ seq2 = "ABCDEFG"
258
+ target_crc = 0x12345678
259
+ MyCRC = CRC.new(29, rand(1 << 29) | 1)
260
+ seq = seq1 + MyCRC.acrc(seq1, seq2, target_crc) + seq2
261
+ p MyCRC[seq] # => #<MyCRC:12345678>
262
+ ```
263
+
264
+
265
+ ## 諸元
266
+
267
+ - package name: crc
268
+ - author: dearblue (mailto:dearblue@users.noreply.github.com)
269
+ - report issue to: <https://github.com/dearblue/ruby-crc/issues>
270
+ - how to install: `gem install crc`
271
+ - version: 0.4.1
272
+ - production quality: TECHNICAL PREVIEW
273
+ - licensing:
274
+ - ***2 clause BSD License: MAIN LICENSE***
275
+ - zlib-style License: `lib/crc/_combine.rb`
276
+ - Creative Commons License Zero (CC0 / Public Domain): `lib/crc/_byruby.rb`, `lib/crc/_models.rb`
277
+ - dependency gems: none
278
+ - dependency external C libraries: none
279
+ - bundled external C libraries: none
280
+ - installed executable file:
281
+ - `rbcrc`: CRC calcuration source code generator for c, ruby and javascript
data/README.md CHANGED
@@ -1,117 +1,124 @@
1
1
 
2
- # crc - CRC generator for ruby
2
+ # crc - CRC calculator for ruby
3
3
 
4
- This is a general CRC (Cyclic Redundancy Check) generator for ruby.
4
+ This is a generic CRC (Cyclic Redundancy Check) calculator for ruby.
5
5
 
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).
6
+ It is written by pure ruby with based on slice-by-eight algorithm (slice-by-16 algorithm with byte-order 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 many more.
8
+ Included built-in CRC models are CRC-32, CRC-32C, CRC-64-XZ, CRC-16, CRC-8-MAXIM, CRC-5-USB and many more.
9
9
 
10
- Customization is posible for 1 to 64 bit width, any polynomial primitives, and with/without bit reflection input/output.
10
+ Customization is posible for 1 to 64 bit width, any polynomials, and with/without bit reflection input/output.
11
11
 
12
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](https://rubygems/gems/crc-turbo).
14
+ If you need more speed, please use with [crc-turbo](https://rubygems.org/gems/crc-turbo).
15
15
 
16
16
 
17
17
  ## Summary
18
18
 
19
19
  * package name: crc
20
- * author: dearblue (mailto:dearblue@users.osdn.me)
21
- * report issue to: <https://osdn.jp/projects/rutsubo/ticket/>
20
+ * author: dearblue (mailto:dearblue@users.noreply.github.com)
21
+ * report issue to: <https://github.com/dearblue/ruby-crc/issues>
22
22
  * how to install: ``gem install crc``
23
- * version: 0.3
24
- * release quality: technical preview
25
- * licensing: BSD-2-Clause<br>any parts are under Creative Commons License Zero (CC0 / Public Domain), and zlib-style License.
23
+ * version: 0.4.2
24
+ * production quality: TECHNICAL PREVIEW
25
+ * licensing:
26
+ * ***BSD-2-Clause : MAIN LICENSE***
27
+ * zlib-style License : ``lib/crc/_combine.rb``
28
+ * Creative Commons License Zero (CC0 / Public Domain) : ``lib/crc/_byruby.rb``, ``lib/crc/_models.rb``
26
29
  * dependency gems: none
27
30
  * dependency external C libraries: none
28
31
  * bundled external C libraries: none
32
+ * installed executable file:
33
+ * rbcrc: CRC calculation source code generator for c, ruby and javascript
29
34
 
30
35
 
31
36
  ## API Guide
32
37
 
33
- This examples are used CRC-32 module. Please see CRC for more details.
38
+ This examples are used CRC-32 model. Please see CRC for more details.
34
39
 
35
- * Calcurate by direct
40
+ ### Calculate by direct
36
41
 
37
- * ``CRC.crc32(seq, init = CRC::CRC32.initial_crc) => crc-32 integer`` (likely as ``Zlib.crc32``)
38
- * ``CRC.crc32.crc(seq, init = CRC::CRC32.initial_crc) => crc-32 integer`` (likely as ``Zlib.crc32``)
39
- * ``CRC.crc32.digest(seq, init = CRC::CRC32.initial_crc) => crc-32 digest`` (likely as ``Digest::XXXX.digest``)
40
- * ``CRC.crc32.hexdigest(seq, init = 0) -> crc-32 hex-digest`` (likely as ``Digest::XXXX.hexdigest``)
41
- * ``CRC.crc32[seq, init = 0, current_length = 0] -> crc-32 generator``
42
- * ``CRC.crc32.new(seq, init = 0, current_length = 0) -> crc-32 generator``
42
+ * ``CRC.crc32(seq, init = CRC::CRC32.initial_crc) => crc-32 integer`` (likely as ``Zlib.crc32``)
43
+ * ``CRC.crc32.crc(seq, init = CRC::CRC32.initial_crc) => crc-32 integer`` (likely as ``Zlib.crc32``)
44
+ * ``CRC.crc32.digest(seq, init = CRC::CRC32.initial_crc) => crc-32 digest`` (likely as ``Digest::XXXX.digest``)
45
+ * ``CRC.crc32.hexdigest(seq, init = CRC::CRC32.initial_crc) -> crc-32 hex-digest`` (likely as ``Digest::XXXX.hexdigest``)
46
+ * ``CRC.crc32[seq, init = CRC::CRC32.initial_crc, current_length = 0] -> crc-32 calculator``
43
47
 
44
- * Calcurate by streaming
48
+ ### Calculate by streaming
45
49
 
46
- * ``CRC.crc32[init = 0, current_length = 0] => crc-32 generator``
47
- * ``CRC.crc32.new(init = 0, current_length = 0) => crc-32 generator``
48
- * ``CRC.crc32#update(seq) => self`` (likely as ``Digest::XXXX.update``)
49
- * ``CRC.crc32#finish => crc-32 integer`` (likely as ``Digest::XXXX.finish``)
50
- * ``CRC.crc32#crc => crc-32 integer`` (same as ``CRC.crc32#finish``)
51
- * ``CRC.crc32#digest => crc-32 digest`` (likely as ``Digest::XXXX.digest``)
52
- * ``CRC.crc32#hexdigest => crc-32 hex-digest`` (likely as ``Digest::XXXX.hexdigest``)
50
+ * ``CRC.crc32.new(init = 0, current_length = 0) => crc-32 calculator``
51
+ * ``CRC::CRC32#update(seq) => self`` (likely as ``Digest::XXXX.update``)
52
+ * ``CRC::CRC32#finish => crc-32 integer`` (likely as ``Digest::XXXX.finish``)
53
+ * ``CRC::CRC32#crc => crc-32 integer`` (same as ``CRC::CRC32#finish``)
54
+ * ``CRC::CRC32#digest => crc-32 digest`` (likely as ``Digest::XXXX.digest``)
55
+ * ``CRC::CRC32#hexdigest => crc-32 hex-digest`` (likely as ``Digest::XXXX.hexdigest``)
53
56
 
54
- Example:
57
+ Example ::
55
58
 
56
- ``` ruby:ruby
57
- x = CRC.crc32.new # => #<CRC::CRC32:00000000>
58
- x.update "123" # => #<CRC::CRC32:884863D2>
59
- x.update "456789" # => #<CRC::CRC32:CBF43926>
60
- x.crc # => 3421780262
61
- x.digest # => "\xCB\xF49&"
62
- x.hexdigest # => "CBF43926"
63
- ```
59
+ ``` ruby:ruby
60
+ x = CRC.crc32.new # => #<CRC::CRC32:00000000>
61
+ x.update "123" # => #<CRC::CRC32:884863D2>
62
+ x.update "456789" # => #<CRC::CRC32:CBF43926>
63
+ x.crc # => 3421780262
64
+ x.digest # => "\xCB\xF49&"
65
+ x.hexdigest # => "CBF43926"
66
+ ```
64
67
 
65
- * Combine
68
+ ### Combine
66
69
 
67
- * ``CRC.combine(crc1, crc2, len2) => combined crc integer`` (likely as ``Zlib.crc32_comibne``)
68
- * ``CRC#+(right_crc) => combined crc generator``
70
+ * ``CRC.combine(crc1, crc2, len2) => combined crc integer`` (likely as ``Zlib.crc32_comibne``)
71
+ * ``CRC#+(right_crc) => combined crc calculator``
69
72
 
70
- Example-1:
73
+ Example-1 ::
71
74
 
72
- ``` ruby:ruby
73
- CRC.crc32.combine(CRC.crc32("123"), CRC.crc32("456789"), 6) # => 3421780262
74
- ```
75
+ ``` ruby:ruby
76
+ CRC.crc32.combine(CRC.crc32("123"), CRC.crc32("456789"), 6) # => 3421780262
77
+ ```
75
78
 
76
- Example-2:
79
+ Example-2 ::
77
80
 
78
- ``` ruby:ruby
79
- CRC.crc32["123"] + CRC.crc32["456"] + CRC.crc32["789"] # => #<CRC::CRC32:CBF43926>
80
- ```
81
+ ``` ruby:ruby
82
+ CRC.crc32["123"] + CRC.crc32["456"] + CRC.crc32["789"] # => #<CRC::CRC32:CBF43926>
83
+ ```
81
84
 
82
- * Create customized crc module
85
+ ### Create customized crc model
83
86
 
84
- * ``CRC.new(bitsize, poly, initial_crc = 0, refin = true, refout = true, xor_output = ~0) => new crc module class``
87
+ * ``CRC.new(bitsize, poly, initial_crc = 0, refin = true, refout = true, xor_output = ~0) => new crc model class``
85
88
 
86
- ``` ruby:ruby
87
- MyCRC32 = CRC.new(32, 0x04C11DB7)
88
- MyCRC32.class # => Class
89
- MyCRC32.hexdigest("123456789") # => "CBF43926"
90
- MyCRC32.new("123456789") # => #<MyCRC32:CBF43926>
91
- ```
89
+ Example ::
92
90
 
93
- * Calcurate arc-crc (***EXPERIMENTAL***)
91
+ ``` ruby:ruby
92
+ MyCRC32 = CRC.new(32, 0x04C11DB7)
93
+ MyCRC32.class # => Class
94
+ MyCRC32.hexdigest("123456789") # => "CBF43926"
95
+ MyCRC32["123456789"] # => #<MyCRC32:CBF43926>
96
+ ```
94
97
 
95
- * ``CRC.acrc(pre, post = nil, want_crc = 0) => arc-crc byte string``
98
+ ### Calculate arc-crc
96
99
 
97
- ``` ruby:ruby
98
- a = "12"
99
- c = "789"
100
- wantcrc = 0xCBF43926
101
- b = CRC.crc32.acrc(a, c, wantcrc) # => "3456"
102
- CRC.crc32[a + b + c] # => #<CRC::CRC32:CBF43926>
103
- ```
100
+ * ``CRC::XXX.acrc(pre, post = nil, want_crc = 0) => arc-crc byte string``
104
101
 
105
- See CRC::ModuleClass.acrc for more detail.
102
+ Example ::
106
103
 
104
+ ``` ruby:ruby
105
+ a = "12"
106
+ c = "789"
107
+ wantcrc = CRC.crc32("123456789")
108
+ b = CRC.crc32.acrc(a, c, wantcrc) # => "3456"
109
+ CRC.crc32[a + b + c] # => #<CRC::CRC32:CBF43926>
110
+ ```
107
111
 
108
- ## Built-in CRC modules
112
+ See CRC::Calculate.acrc or below for more detail.
113
+
114
+
115
+ ## Built-in CRC models
109
116
 
110
- ``` shell:shell
111
- % ruby -rcrc -e 'puts CRC::MODULE_TABLE.values.uniq.map { |m| m.name }.join(", ")'
117
+ ```
118
+ $ rbcrc -lq
112
119
  ```
113
120
 
114
- 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, CRC-16, 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-16-A, CRC-16-KERMIT, CRC-16-MODBUS, CRC-16-X-25, CRC-16-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, CRC-32-JAMCRC, CRC-32-XFER, CRC-40-GSM, CRC-64-XZ, CRC-64-ECMA, CRC-64-WE, CRC-64-ISO
121
+ 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-ROHC, CRC-7-UMTS, 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, CRC-16, 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-16-A, CRC-16-KERMIT, CRC-16-MODBUS, CRC-16-X-25, CRC-16-XMODEM, 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-CDMA, CRC-31-PHILIPS, CRC-32, CRC-32-BZIP2, CRC-32C, CRC-32D, CRC-32-MPEG-2, CRC-32-POSIX, CRC-32Q, CRC-32-JAMCRC, CRC-32-XFER, CRC-40-GSM, CRC-64-XZ, CRC-64-JONES, CRC-64-ECMA, CRC-64-WE, CRC-64-ISO
115
122
 
116
123
 
117
124
  ## Environment variables for behavior
@@ -127,13 +134,100 @@ CRC-1, CRC-3-ROHC, CRC-4-INTERLAKEN, CRC-4-ITU, CRC-5-EPC, CRC-5-ITU, CRC-5-USB,
127
134
  CRC.combine is ported from Mark Adler's crccomb.c in <https://stackoverflow.com/questions/29915764/generic-crc-8-16-32-64-combine-implementation#29928573>.
128
135
 
129
136
 
130
- ## arc-crc (***EXPERIMENTAL***)
137
+ ## Source code generator for the specific CRC calculator (from crc-0.3.1)
131
138
 
132
- (Written in japanese from here)
139
+ Add source code generator for the specific CRC calculator to c, ruby, and javascript.
140
+
141
+ Algorithm is slicing-by-16 only for ruby and javascript.
142
+
143
+ For C, be able choose into bit-by-bit, bit-by-bit-fast, halfbyte-table,
144
+ standard-table, slicing-by-4, slicing-by-8, and slicing-by-16.
145
+
146
+ ```
147
+ $ rbcrc --help
148
+ usage: rbcrc [options] output-filename...
149
+ -m crcname choose included crc name in library (``-l'' to print list)
150
+ -n crcname declare function name or class name [DEFAULT is filename]
151
+ -s bitsize declare crc bit size [REQUIRED for customized crc]
152
+ -p polynom declare crc polynomial [REQUIRED for customized crc]
153
+ -c initcrc declare initial crc (not internal state) [DEFAULT: 0]
154
+ -S initstate declare initial state (internal state) [DEFAULT: unset]
155
+ -x xormask declare xor bit mask for when output [DEFAULT: ~0]
156
+ -i reflect input [DEFAULT]
157
+ -I normal input (not reflect)
158
+ -o reflect output [DEFAULT]
159
+ -O normal output (not reflect)
160
+ -a algorithm switch algorithm (see below) (C file type only)
161
+
162
+ -l print crc names
163
+ -f force overwrite
164
+ -v increment verbosery level
165
+ -q quiet mode (reset verbosery level to zero)
166
+
167
+ About LICENSE for generated source code:
168
+ Generated code is under Creative Commons License Zero (CC0 / Public Domain).
169
+ See https://creativecommons.org/publicdomain/zero/1.0/
170
+
171
+ Algorithms (C file type only):
172
+ bit-by-bit, bit-by-bit-fast, halfbyte-table, standard-table,
173
+ slicing-by-4, slicing-by-8, slicing-by-16, slicing-by-{2..999}
174
+
175
+ Support export file types:
176
+ * .c for C (support C89, but required ``stdint.h'')
177
+ * .js for javascript (required ECMAScript 6th edition)
178
+ * .rb for ruby (for ruby-2.1+, jruby, and rubinius)
179
+ (executable for ruby-1.8, ruby-1.9 and ruby-2.0)
180
+ (executable for mruby and limitation bitsize by fixnum)
181
+
182
+ examples:
183
+ * create crc-32 calculator to c source (and header file)
184
+ $ rbcrc crc32.c
185
+
186
+ * create crc-32c calculator to ruby source
187
+ $ rbcrc crc32c.rb
188
+
189
+ * create crc-30-cdma calculator to javascript source
190
+ $ rbcrc crc30cdma.js
191
+
192
+ * create crc-32 calculator to ``crc.c'', ``crc.rb'' and ``crc.js''
193
+ $ rbcrc -mcrc32 crc.c crc.rb crc.js
194
+
195
+ * create customized crc calculator (as mycrc function) to ``mycrc.c''
196
+ $ rbcrc -s15 -p0x6789 -io -x~0 mycrc.c
197
+
198
+ * create customized crc calculator (as MyCRC class) to ``mycrc_1.rb''
199
+ $ rbcrc -s39 -p0x987654321 -IO -x1 -nMyCRC mycrc_1.rb
200
+ ```
201
+
202
+ - - - -
203
+
204
+ And, this command has feature too that is print for each CRC specifications as YAML format.
205
+
206
+ ``` text
207
+ $ rbcrc -lvv
208
+ ...snip...
209
+ "CRC-32":
210
+ bitsize: 32
211
+ polynomial: 0x04C11DB7 # 0xEDB88320 (bit reflected)
212
+ reversed reciprocal: 0x82608EDB # 0xDB710641 (bit reflected)
213
+ reflect input: true
214
+ reflect output: true
215
+ initial crc: 0x00000000 # 0xFFFFFFFF (initial state)
216
+ xor output: 0xFFFFFFFF
217
+ magic number: 0x2144DF1C # 0xDEBB20E3 (internal state)
218
+ another names:
219
+ - "CRC-32-ADCCP"
220
+ - "CRC-32-PKZIP"
221
+ - "PKZIP"
222
+ ...snip...
223
+ ```
133
224
 
134
- crc-0.3 にて、任意の CRC となるバイト列を逆算する機能が***実験的に***追加されました。
135
225
 
136
- 今のところは、reflect-input/output 限定となっています。
226
+ ## arc-crc
227
+
228
+ (Written in japanese from here)
229
+
230
+ crc-0.4 にて、任意の CRC となるバイト列を逆算する機能が正式に追加されました。
137
231
 
138
232
  ``require "crc/acrc"`` にて、その機能が利用可能となります。
139
233