$ZCRC (ObjectScript)
構文
$ZCRC(string,mode,expression)
引数
引数 | 説明 |
---|---|
string | チェックサム演算が実行される文字列。 |
mode | 使用するチェックサム・モードを指定する整数コード。 |
expression | オプション — "seed" の初期値。整数として指定します。省略した場合、既定はゼロ (0) です。 |
概要
$ZCRCstring に対して冗長巡回検査を実行し、整数のチェックサム値を返します。$ZCRC によって返される値は、使用する引数により異なります。
-
$ZCRC(string,mode) は、文字列のチェックサムを計算して返します。mode の値により、$ZCRC が計算するチェックサムのタイプが決まります。
-
$ZCRC(string,mode,expression) は、mode により指定されたモードを使用して、string のチェックサムを計算して返します。expression は、複数の文字列をチェックする際 "seed" の初期値を提供します。これにより、複数の文字列で連続的に $ZCRC 計算を実行し、それらの文字列を連結して $ZCRC を実行したかのように、同じチェックサム値を得ることができます。
引数
string
バイト文字列。値、変数、式として指定できます。バイトの文字列のみを使用し、それ以外を使用した場合は、<FUNCTION> エラーが発生します。
mode
使用するチェックサム・アルゴリズム。すべてのチェックサム・モードは、8 ビット (ASCII) または 16 ビット Unicode (ワイド) 文字を使用できます。規定の mode 値は以下のとおりです。
モード | 計算 |
---|---|
0 | 8 ビットのバイト加算値。文字列内の文字の ASCII 値の合計です。したがって、$ZCRC(2,0)=50、$ZCRC(22,0)=100、$ZCRC(23,0)=101、$ZCRC(32,0)=101 となります。 |
1 | XOR 8 ビットの 加算値 |
2 | 16 ビットのデータ・ツリー CRC-CCITT |
3 | 16 ビットのデータ・ツリー CRC-16 |
4 | XMODEM プロトコルの 16 ビット CRC |
5 | 正しい 16 ビット CRC-CCITT |
6 | 正しい 16 ビット CRC-16 |
7 | 正しい 32 ビット CRC-32。これは、OS X および Java ユーティリティ・パッケージの CRC32 クラスの cksum ユーティリティ・アルゴリズム 3 に相当します。 |
8 | 32 ビットの Murmur3 ハッシュ (x64 バリアント) |
9 | 128 ビットの Murmur3 ハッシュ (x64 バリアント) |
expression
"seed" の初期値である引数。$ZCRC は string に対して生成したチェックサムに expression を追加します。これにより、複数の文字列で連続的に $ZCRC 計算を実行し、それらの文字列を連結して $ZCRC を実行したかのように、保存済みのチェックサム値を得ることができます。$ZCRC 式のチェイニングは、きわめて長い文字列を分割して <MAXSTRING> エラーを防止するうえで効果的です。Murmur3 ハッシュ (モード 8 および 9) では expression 引数がサポートされていません。
例
以下の例では、文字 A、B、および C を含む文字列で mode=0 を使用し、それぞれチェックサム 198 を返します。
write $ZCRC("ABC",0),!
write $ZCRC("CAB",0),!
write $ZCRC("BCA",0),!
チェックサムは、以下のようにして得られます。
write $ASCII("A")+$ASCII("B")+$ASCII("C") /* 65+66+67 = 198 */
以下の例は、文字列 "ABC" の各 mode により返される値を示します。
for i=0:1:9 { write "mode ",i," = ",$ZCRC("ABC",i),! }
以下の例は、前の $ZCRC 値の出力を次の計算のシードとして使用できる様子を示します。1 から 7 までの各モードでは、"ABC" の CRC は "A"、"B"、"C" に対して連続して計算した CRC に等しく、それぞれの計算にはその前の文字の CRC がシードされています。モード 8 および 9 (Mumur3 ハッシュ) では、Murmur3 が連鎖式をサポートしていないため、CRC 計算は等しくなりません。
for mode = 1:1:9 {
set crc1 = $zcrc("ABC",mode)
set crc2 = $zcrc("A",mode)
set crc2 = $zcrc("B",mode,crc2)
set crc2 = $zcrc("C",mode,crc2)
write "mode ", mode," ", "crc1 = crc2: ", crc1 = crc2, !
}
関連項目
-
$ZCYC 関数