10进制和16进制互转
Kevin Zou
2011-8-26
在工作当中常会遇到10进制和16进制互转,比如LATCH的ADDRESS。
在一个latch: cache buffers chains 中,ADDRESS用10进制记录,可在V$LATCH_ADDRESS是用RAW,16进制查看的。这就要不同进制之间进行转换。
10-> 16: to_char
16-> 10: to_number
如这句10046中摘出来的片段:
WAIT #2: nam='latch: cache buffers chains' ela= 7 address=504403174424697944 number=124 tries=0 obj#=-1 tim=51874243369174
这里address=504403174424697944,那转为16进制是:
10-> 16
select to_char(504403174424697944 ,'XXXXXXXXXXXXXXXXXXX') as a from dual;
A
----------------------------------------
7000003C329DC58
这里有个需要注意的地方,需要在在得出的16进制前加上一个0。
|
如果知道了RAW地址,求10进制的地址,可以用to_number 函数。
16-> 10
SYS@hr9prd>col a format 99999999999999999999999999
SYS@hr9prd> select to_number('7000003C329DC58', 'XXXXXXXXXXXXXXXXXXXXXX') as a from dual;
A
---------------------------
504403174424697944
Elapsed: 00:00:00.01
需要注意如果转换后的位数过多,而未能在格式中包括全部的位数,那会报错:
SYS@hr9prd> select to_number('7000003C329DC58', 'XXXXXXXXXXXX') from dual;
select to_number('7000003C329DC58', 'XXXXXXXXXXXX') from dual
*
ERROR at line 1:
ORA-01722: invalid number
总结:
10进制到16进制,使用to_char 函数;
16进制到10进制,使用to_number函数;
-THE END-