Oracle

TCP/IP チェックサム値をOracle FUNCTIONで作成

記事内に商品プロモーションを含む場合があります
私が作成した理由

バイナリーデータをTCP/IPのチェックサム値がOracle上で必要だった。

Oracleの関数でTCP/IP checksumが無いので作成しました。

チェックサム計算方法を図で

  1. 1バイトづつ別ける
  2. 16進数⇨10進数に変換
  3. 全てを足す
  4. 10進数⇨2進数に変換
  5. 反転(1の補数)
  6. 2進数⇨10進数に変換
  7. 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;

インフラエンジニアを目指す方へ

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA