rem ----------------------------------------------------------------------- rem Filename: dbms_numsystem.sql rem Purpose: Package with functions to convert numbers between the rem Decimal, Binary, Octal and Hexidecimal numbering systems. rem Usage: See sampels at the bottom of this file rem Author: Frank Naude, 17 February 2003 rem ----------------------------------------------------------------------- set serveroutput on CREATE OR REPLACE PACKAGE dbms_numsystem AS function bin2dec (binval in char ) RETURN number; function dec2bin (N in number) RETURN varchar2; function oct2dec (octval in char ) RETURN number; function dec2oct (N in number) RETURN varchar2; function hex2dec (hexval in char ) RETURN number; function dec2hex (N in number) RETURN varchar2; END dbms_numsystem; / show errors CREATE OR REPLACE PACKAGE BODY dbms_numsystem AS FUNCTION bin2dec (binval in char) RETURN number IS i number; digits number; result number := 0; current_digit char(1); current_digit_dec number; BEGIN digits := length(binval); for i in 1..digits loop current_digit := SUBSTR(binval, i, 1); current_digit_dec := to_number(current_digit); result := (result * 2) + current_digit_dec; end loop; return result; END bin2dec; FUNCTION dec2bin (N in number) RETURN varchar2 IS binval varchar2(64); N2 number := N; BEGIN while ( N2 > 0 ) loop binval := mod(N2, 2) || binval; N2 := trunc( N2 / 2 ); end loop; return binval; END dec2bin; FUNCTION oct2dec (octval in char) RETURN number IS i number; digits number; result number := 0; current_digit char(1); current_digit_dec number; BEGIN digits := length(octval); for i in 1..digits loop current_digit := SUBSTR(octval, i, 1); current_digit_dec := to_number(current_digit); result := (result * 8) + current_digit_dec; end loop; return result; END oct2dec; FUNCTION dec2oct (N in number) RETURN varchar2 IS octval varchar2(64); N2 number := N; BEGIN while ( N2 > 0 ) loop octval := mod(N2, 8) || octval; N2 := trunc( N2 / 8 ); end loop; return octval; END dec2oct; FUNCTION hex2dec (hexval in char) RETURN number IS i number; digits number; result number := 0; current_digit char(1); current_digit_dec number; BEGIN digits := length(hexval); for i in 1..digits loop current_digit := SUBSTR(hexval, i, 1); if current_digit in ('A','B','C','D','E','F') then current_digit_dec := ascii(current_digit) - ascii('A') + 10; else current_digit_dec := to_number(current_digit); end if; result := (result * 16) + current_digit_dec; end loop; return result; END hex2dec; FUNCTION dec2hex (N in number) RETURN varchar2 IS hexval varchar2(64); N2 number := N; digit number; hexdigit char; BEGIN while ( N2 > 0 ) loop digit := mod(N2, 16); if digit > 9 then hexdigit := chr(ascii('A') + digit - 10); else hexdigit := to_char(digit); end if; hexval := hexdigit || hexval; N2 := trunc( N2 / 16 ); end loop; return hexval; END dec2hex; END dbms_numsystem; / show errors -- Examples: select dbms_numsystem.dec2bin(22) from dual; select dbms_numsystem.bin2dec('10110') from dual; select dbms_numsystem.dec2oct(44978) from dual; select dbms_numsystem.oct2dec(127662) from dual; select dbms_numsystem.dec2hex(44978) from dual; select dbms_numsystem.hex2dec('AFB2') from dual;