チェックサム計算(モジュラス103)
チェックサムを計算するのが大変なのでエクセルで作ってみました
桁数を気にしないでよくシンプルな形です
コード表
Value Table B
0
1 !
2 "
3 #
4 $
5 %
6 &
7 '
8 (
9 )
10 *
11 +
12 ,
13 -
14 .
15 /
16 0
17 1
18 2
19 3
20 4
21 5
22 6
23 7
24 8
25 9
26 :
27 ;
28 <
29 =
30 >
31 ?
32 @
33 A
34 B
35 C
36 D
37 E
38 F
39 G
40 H
41 I
42 J
43 K
44 L
45 M
46 N
47 O
48 P
49 Q
50 R
51 S
52 T
53 U
54 V
55 W
56 X
57 Y
58 Z
59 [
60 \
61 ]
62 ^
63 _
64 `
65 a
66 b
67 c
68 d
69 e
70 f
71 g
72 h
73 i
74 j
75 k
76 l
77 m
78 n
79 o
80 p
81 q
82 r
83 s
84 t
85 u
86 v
87 w
88 x
89 y
90 z
91 {
92 |
93 }
94 ~
95 D
96 3
97 2
98 S
99 c
100 4
101 a
102 1
103 A
104 B
105 C
106 E
数式
たとえば、「Code Set B」で「HELLO」をエンコードする場合:A1セルに文字を入れるとします
B1セル
=MOD(104+SUMPRODUCT(IFERROR(MATCH(MID(A1, ROW(INDIRECT("1:" & LEN(A1))), 1), codeb!B:B,0),2) - 2,ROW(INDIRECT("1:" & LEN(A1)))), 103)
=MOD(104+SUMPRODUCT(IFERROR(MATCH(MID(A1, ROW(INDIRECT("1:" & LEN(A1))), 1), $codeb.B:B,0),2) - 2,ROW(INDIRECT("1:" & LEN(A1)))), 103)
C1セル
=@INDEX(codeb!B:B,B1+2)
=INDEX($codeb.B:B,B1+2)
D1セル
=codeb!$B$106&A1&C1&codeb!$B$108
=$codeb.$B$106&A1&C1&$codeb.$B$108
計算式の概要
=MOD(104+SUMPRODUCT(IFERROR(MATCH(MID(A1, ROW(INDIRECT("1:" & LEN(A1))), 1), $codeb.B:B,0),2) - 2,ROW(INDIRECT("1:" & LEN(A1)))), 103)
ステップごとの説明:
- MID関数とROW関数:
MID(A1, ROW(INDIRECT("1:" & LEN(A1))), 1)
- これはセル
A1
の文字列(例えば「HELLO」)の各文字を1文字ずつ取り出す部分です。 ROW(INDIRECT("1:" & LEN(A1)))
で1から文字列の長さまでの数列を生成{“H", “E", “L", “L", “O"}し、MID
関数でその数列に従って各文字を取り出します
- MATCH関数:
- MATCH(MID(A1, ROW(INDIRECT(“1:" & LEN(A1))), 1), $codeb.B:B,0)
MID
関数で取り出した各文字が$codeb
シートのB列にある場合、その位置を返します。B列は「Code Set B」の対応表を持つと仮定します。IFERROR(..., 2)
はエラーが発生した場合に2を返すようにします。- {40, 37, 44, 44, 47}
- 重み付け行番号の生成
ROW(INDIRECT("1:" & LEN(A1)))
これは行番号の配列です:
{1, 2, 3, 4, 5} - SUMPRODUCT関数:
SUMPRODUCT(IFERROR(MATCH(...),2) - 2, ROW(...))
MATCH
で得た位置から2を引き、文字の位置に基づいた重み付き合計を計算します。- 40*1+37*2+44*3+44*4+47*5=657
- MOD関数:
MOD(104 + ..., 103)
- 最終的に104を足した結果を103で割った余りを計算します。40
文字の取得
=INDEX($codeb.B:B,B1+2)
Hがチェックキャラクターになります
ディスカッション
コメント一覧
まだ、コメントがありません