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 +5 -5
- data/HISTORY.ja.md +85 -0
- data/README.ja.md +281 -0
- data/README.md +167 -73
- data/bin/rbcrc +297 -0
- data/bin/rbcrc.orig +295 -0
- data/gemstub.rb +30 -10
- data/lib/crc.rb +63 -257
- data/lib/crc/_aux.rb +37 -0
- data/lib/crc/_byruby.rb +94 -41
- data/lib/crc/_combine.rb +1 -1
- data/lib/crc/_extensions.rb +211 -0
- data/lib/crc/_file.rb +15 -0
- data/lib/crc/_magic.rb +93 -0
- data/lib/crc/{_modules.rb → _models.rb} +7 -6
- data/lib/crc/_shift.rb +198 -0
- data/lib/crc/_utils.rb +114 -0
- data/lib/crc/acrc.rb +18 -73
- data/lib/crc/codegen.rb +881 -0
- data/lib/crc/version.rb +1 -1
- data/test/common.rb +23 -0
- data/test/self_check.rb +31 -0
- data/test/test_arc.rb +23 -0
- data/test/test_block.rb +28 -0
- data/test/test_magic.rb +25 -0
- metadata +42 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0b6f6d28a243bad0ffb9e82e9aee4209345b284cd82433783da10a2ebe60c049
|
4
|
+
data.tar.gz: e7c0aea67d734fc21567428df2d46047e2d8484d1f6147dbafcd4f9d280d8466
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '02249a8be40ac1ec6590841b217aec8f4cc0f5a5fddd1f563e573820bc50094320aed04b03ebcdcf93e0c4b85d19da8fe0973eaa6f3c586da3702a69ab6f7c08'
|
7
|
+
data.tar.gz: 9b5885a2b02026dc254953ce93024b5a8ac69e576698c6f4a8a42b0b93062bb5011d7c6478498c3bee6635b8a185b795f559591970f122ca81c6e68d7d32b2fb
|
data/HISTORY.ja.md
CHANGED
@@ -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
|
互換性を損なう変更があります。
|
data/README.ja.md
ADDED
@@ -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
|
2
|
+
# crc - CRC calculator for ruby
|
3
3
|
|
4
|
-
This is a
|
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
|
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
|
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
|
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.
|
21
|
-
* report issue to: <https://
|
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.
|
24
|
-
*
|
25
|
-
* licensing:
|
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
|
38
|
+
This examples are used CRC-32 model. Please see CRC for more details.
|
34
39
|
|
35
|
-
|
40
|
+
### Calculate by direct
|
36
41
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
48
|
+
### Calculate by streaming
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
57
|
+
Example ::
|
55
58
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
68
|
+
### Combine
|
66
69
|
|
67
|
-
|
68
|
-
|
70
|
+
* ``CRC.combine(crc1, crc2, len2) => combined crc integer`` (likely as ``Zlib.crc32_comibne``)
|
71
|
+
* ``CRC#+(right_crc) => combined crc calculator``
|
69
72
|
|
70
|
-
|
73
|
+
Example-1 ::
|
71
74
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
``` ruby:ruby
|
76
|
+
CRC.crc32.combine(CRC.crc32("123"), CRC.crc32("456789"), 6) # => 3421780262
|
77
|
+
```
|
75
78
|
|
76
|
-
|
79
|
+
Example-2 ::
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
+
``` ruby:ruby
|
82
|
+
CRC.crc32["123"] + CRC.crc32["456"] + CRC.crc32["789"] # => #<CRC::CRC32:CBF43926>
|
83
|
+
```
|
81
84
|
|
82
|
-
|
85
|
+
### Create customized crc model
|
83
86
|
|
84
|
-
|
87
|
+
* ``CRC.new(bitsize, poly, initial_crc = 0, refin = true, refout = true, xor_output = ~0) => new crc model class``
|
85
88
|
|
86
|
-
|
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
|
-
|
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
|
-
|
98
|
+
### Calculate arc-crc
|
96
99
|
|
97
|
-
|
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
|
-
|
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
|
-
|
112
|
+
See CRC::Calculate.acrc or below for more detail.
|
113
|
+
|
114
|
+
|
115
|
+
## Built-in CRC models
|
109
116
|
|
110
|
-
```
|
111
|
-
|
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-
|
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
|
-
##
|
137
|
+
## Source code generator for the specific CRC calculator (from crc-0.3.1)
|
131
138
|
|
132
|
-
|
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
|
-
|
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
|
|