Oracle中二进制、八进制、十进制和十六进制相互转换函数

最近,工作中需要查看某些字段的二进制格式,索性写了一些进制相互转换的函数,以方便调用。

记录下这些代码,以备使用。

create or replace package pkg_digit_conv as

  --将字符串转换为其在数据库中的二进制存储格式
  function fun_str2bin(par_str in varchar2) return varchar2;  

  --将二进制转换为10进制
  function fun_bin2dec(par_bin in varchar2) return varchar2;
  --将二进制转换为8进制
  function fun_bin2oct(par_bin in varchar2) return varchar2;
  --将二进制转换为16进制
  function fun_bin2hex(par_bin in varchar2) return varchar2;
  --将10进制转换为二进制
  function fun_dec2bin(par_dec in varchar2) return varchar2;
  --将8进制转换为二进制
  function fun_oct2bin(par_oct in varchar2) return varchar2;
  --将16进制转换为二进制
  function fun_hex2bin(par_hex in varchar2) return varchar2;  

end;  

create or replace package body pkg_digit_conv as

  --将字符串转换为其在数据库中的二进制存储格式
  function fun_str2bin(par_str in varchar2) return varchar2
  as
  v_strlen pls_integer;
  v_detemp number;
  v_bintemp varchar2(20);
  v_retval varchar2(1000);
  begin
    select length(par_str) into v_strlen from dual;
    for i in 1 .. v_strlen loop
      select to_number(ascii(substr(par_str,i,1))) into v_detemp from dual;
      select fun_dec2bin(v_detemp) into v_bintemp from dual;
      v_retval :=nvl(v_retval,'')|| v_bintemp;
    end loop;
    return v_retval;
  end;  

  --将二进制转换为10进制
  function fun_bin2dec(par_bin in varchar2) return varchar2
  as
  v_retval varchar2(100);
  begin
    select sum(d) into v_retval from (
      select substr(par_bin,rownum,1)*power(2,length(par_bin)-rownum) d from dual connect by rownum <= length(par_bin)
    );
    return v_retval;
  end;  

  --将二进制转换为8进制
  function fun_bin2oct(par_bin in varchar2) return varchar2
  as
  v_octlen pls_integer;
  v_octtemp varchar2(3);
  v_retemp varchar2(1);
  v_retval varchar2(1000);
  begin
    select ceil(length(par_bin)/3) into v_octlen from dual;   

    for i in 1..v_octlen loop
      if(3*i<=length(par_bin)) then
        select substr(par_bin,0-3*i,3) into v_octtemp from dual;
      else
        select substr(par_bin,0-length(par_bin),length(par_bin)-3*i+3) into v_octtemp from dual;
      end if;
      select fun_bin2dec(v_octtemp) into v_retemp from dual;
      v_retval := v_retemp||nvl(v_retval,'');
    end loop;
    return v_retval;
  end;  

  --将二进制转换为16进制
  function fun_bin2hex(par_bin in varchar2) return varchar2
  as
  v_hexlen pls_integer;
  v_hextemp varchar2(4);
  v_retemp varchar2(1);
  v_retval varchar2(1000);
  begin
  select ceil(length(par_bin)/4) into v_hexlen from dual;   

    for i in 1..v_hexlen loop
      if(4*i<=length(par_bin)) then
        select substr(par_bin,0-4*i,4) into v_hextemp from dual;
      else
        select substr(par_bin,0-length(par_bin),length(par_bin)-4*i+4) into v_hextemp from dual;
        select substr('000'||v_hextemp,-4,4) into v_hextemp from dual;
      end if;
      case v_hextemp
         WHEN '0000' THEN v_retemp :='0' ;
         WHEN '0001' THEN v_retemp :='1' ;
         WHEN '0010' THEN v_retemp :='2' ;
         WHEN '0011' THEN v_retemp :='3' ;
         WHEN '0100' THEN v_retemp :='4' ;
         WHEN '0101' THEN v_retemp :='5' ;
         WHEN '0110' THEN v_retemp :='6' ;
         WHEN '0111' THEN v_retemp :='7' ;
         WHEN '1000' THEN v_retemp :='8' ;
         WHEN '1001' THEN v_retemp :='9' ;
         WHEN '1010' THEN v_retemp :='A' ;
         WHEN '1011' THEN v_retemp :='B' ;
         WHEN '1100' THEN v_retemp :='C' ;
         WHEN '1101' THEN v_retemp :='D' ;
         WHEN '1110' THEN v_retemp :='E' ;
         else v_retemp :='F' ;
      end case;
      v_retval := v_retemp||nvl(v_retval,'');
    end loop;
    return v_retval;
  end;  

  --将10进制转换为二进制
  function fun_dec2bin(par_dec in varchar2) return varchar2  

  as
    yushu number;
    retemp varchar2(1);
    retval varchar2(1000);
  begin
    select to_number(par_dec) into yushu from dual;
    while yushu >0 loop
      select mod(yushu,2) into retemp from dual;
      retval := retemp || nvl(retval,'');
      select trunc(yushu/2) into yushu from dual;
    end loop;
    return retval;
  end;  

  --将8进制转换为二进制
  function fun_oct2bin(par_oct in varchar2) return varchar2
  as
  v_octlen pls_integer;
  v_octchar varchar2(1);
  v_dectemp number := 0;
  v_retval varchar2(1000);
  begin
    select length(par_oct) into v_octlen from dual;
    for i in 1..v_octlen loop
      v_dectemp := v_dectemp + to_number(substr(par_oct,i,1))*power(8,v_octlen-i);
    end loop;
    select fun_dec2bin(to_char(v_dectemp)) into v_retval from dual;
    return v_retval;
  end;  

  --将16进制转换为二进制
  function fun_hex2bin(par_hex in varchar2) return varchar2
  as
  v_hexlen pls_integer;
  v_dectemp number;
  begin
    select length(par_hex) into v_hexlen from dual;
    select to_number(par_hex,lpad('x',v_hexlen,'x')) into v_dectemp from dual;
    return fun_dec2bin(v_dectemp);
  end;  

end;

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索二进制
, 进制
, return
, function
, varchar2
varchar
二进制八进制十六进制、二进制转八进制、二进制转八进制算法、二进制转换八进制、二进制转换为八进制,以便于您获取更多的相关知识。

时间: 2024-08-30 11:05:22

Oracle中二进制、八进制、十进制和十六进制相互转换函数的相关文章

Oracle中的二进制、八进制、十进制、十六进制相互转换函数

原文:Oracle中的二进制.八进制.十进制.十六进制相互转换函数 Oracle中的二进制.八进制.十进制.十六进制相互转换函数   今天在网上看到一篇关于在oracle中对各种进制数进行转换的帖子,觉得不错,也比较全面,几乎涵盖了经常用到的所有转换.转过来学习一下,也方便以后查询. ================================================================================== 大家经常遇到进制转换的问题,网上搜到的转换只是部

Python进制转换(二进制/八进制/十进制/十六进制)

Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html    全局定义 base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]   二进制 to 十进制 : int(str,n=10)  def bin2dec(string_num): return str(

C# 二进制,十进制,十六进制 互转

C# 二进制,十进制,十六进制 互转 //十进制转二进制Console.WriteLine(Convert.ToString(69, 2));//十进制转八进制Console.WriteLine(Convert.ToString(69, 8));//十进制转十六进制Console.WriteLine(Convert.ToString(69, 16)); //二进制转十进制Console.WriteLine(Convert.ToInt32("100111101″, 2));//八进制转十进制Con

浅谈二进制、十进制、十六进制、字符串之间的相互转换_java

1. 字节转10进制 直接使用(int)类型转换. /* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int) b; return r; } 2. 10进制转字节 直接使用(byte)类型转换. /* * 10进制转字节 */ public static byte int2Byte(int i){ byte r = (byte) i; return r; } 3. 字节数组转16进制字符串 对每一个字节,先和0xFF做与运算

进制转换算法原理(二进制 八进制 十进制 十六进制)_相关技巧

1.二进制数.八进制数.十六进制数转十进制数 有一个公式:二进制数.八进制数.十六进制数的各位数字分别乖以各自的基数的(N-1)次方,其和相加之和便是相应的十进制数.个位,N=1;十位,N=2...举例: 110B=1*2的2次方+1*2的1次方+0*2的0次方=0+4+2+0=6D 110Q=1*8的2次方+1*8的1次方+0*8的0次方=64+8+0=72D 110H=1*16的2次方+1*16的1次方+0*16的0次方=256+16+0=272D 2.十进制数转二进制数.八进制数.十六进制

整理C# 二进制,十进制,十六进制 互转_C#教程

//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(69, 8)); //十进制转十六进制 Console.WriteLine(Convert.ToString(69, 16)); //二进制转十进制 Console.WriteLine(Convert.ToInt32("100111101″, 2)); //八进制转十进制 Console.WriteL

Oracle中处理LOB字段的常用字符函数

以前处理LOB字段都是使用DBMS_LOB包,最近看了文档才发现,原来很多常用的字符函数都是支持LOB字段的. 建立一个测试表: SQL> CREATE TABLE T_LOB (ID NUMBER, CONTENTS CLOB); Table created. SQL> DECLARE 2     V_LOB CLOB; 3  BEGIN 4        INSERT INTO T_LOB 5     VALUES (1, EMPTY_CLOB()) 6     RETURN  CONTE

Oracle中获取会话信息的两个函数分享_oracle

1. USERENV(OPTION)  返回当前的会话信息.  OPTION='ISDBA'若当前是DBA角色,则为TRUE,否则FALSE.  OPTION='LANGUAGE'返回数据库的字符集.  OPTION='SESSIONID'为当前会话标识符.  OPTION='ENTRYID'返回可审计的会话标识符.  OPTION='LANG'返回会话语言名称的ISO简记.  OPTION='INSTANCE'返回当前的实例.      OPTION='terminal'返回当前计算机名  S

php中十进制、二进制、八进制和十六进制转换函数

一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例  代码如下 复制代码 echo decbin(12); //输出 1100 echo decbin(26); //输出 11010 decbin (PHP 3, PHP 4, PHP 5) decbin -- 十进制转换为二进制 说明 string decbin ( int number ) 返回一字符串,包含有给定 number 参数的二进制表示.所能转换的最大数值为十进制的 4294