私が作成した理由
バイナリーデータをTCP/IPのチェックサム値がOracle上で必要だった。
Oracleの関数でTCP/IP checksumが無いので作成しました。
スポンサーリンク
チェックサム計算方法を図で
- 1バイトづつ別ける
- 16進数⇨10進数に変換
- 全てを足す
- 10進数⇨2進数に変換
- 反転(1の補数)
- 2進数⇨10進数に変換
- 10進数⇨16進数に変換
ソース
create or replace FUNCTION TCPIPCHECKSUM
(
i_Binary IN VARCHAR2
) RETURN VARCHAR2
IS
v_i NUMBER(9);
v_btmp VARCHAR2(2);
v_size NUMBER(9);
v_mod NUMBER(9);
v_dec NUMBER(9);
v_sum NUMBER(9);
v_bin VARCHAR2(2000);
v_binr VARCHAR2(2000);
v_hex VARCHAR2(2000);
BEGIN
v_i := 1;
v_sum := 0;
v_size := Length(i_Binary);
WHILE v_i <= v_size LOOP
--1バイトづつ取得
v_btmp := SUBSTR(i_Binary,v_i,2);
--16進数⇒10進数に変換して加算
v_sum := v_sum + HEX16_DEC10(v_btmp);
--カウントアップ
v_i := v_i + 2;
END LOOP;
--10進数⇒2進数に変換
v_bin := dec10_bin2(v_sum);
--補正
v_mod := MOD(Length(v_bin),4);
IF v_mod = 1 then
v_bin := concat('0',v_bin);
elsif v_mod = 2 then
v_bin := concat('00',v_bin);
elsif v_mod = 3 then
v_bin := concat('000',v_bin);
else
null;
end if;
スポンサーリンク