[20190819]如何快速转换16进制串到字符串.txt
--//ITPUB网友问的问题,我一般使用如下函数转换:
$ cat conv_c.sql
select utl_raw.cast_to_varchar2(lower('&1')) c60 from dual;
$ cat conv_n.sql
select utl_raw.cast_to_number(lower('&1')) n20 from dual;
1.环境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
2.测试:
SQL> select dump('BOOTSTRAP$',16) from dual;
DUMP('BOOTSTRAP$',16)
--------------------------------------------
Typ=96 Len=10: 42,4f,4f,54,53,54,52,41,50,24
SCOTT@test01p> @ conv_c 424f4f54535452415024
C60
------------------------------------------------------------
BOOTSTRAP$
--//缺点当然是必须在启动数据库的情况下执行。
--//实际上有时候获得16进制字符串并不符合规定的格式,比如转储文件或者bbed,必须首先编辑处理。
--//比如常见的格式如下:
0x42 0x4F 0x54 0x53 0x54 0x52 0x41 0x50 0x24
0x42,0x4f,0x54,0x53,0x54,0x52,0x41,0x50,0x24
42,4f,4f,54,53,54,52,41,50,24
424f4f54535452415024
SCOTT@test01p> select rowid,dept.* from dept where rownum=1;
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------------- -------------
AAAFfXAALAAAACEAAA 10 ACCOUNTING NEW YORK
SCOTT@test01p> @ rowid AAAFfXAALAAAACEAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
------ ---- ----- ---------- ---------- ------ ----------------------------------------
22487 11 132 0 0x2C00084 11,132 alter system dump datafile 11 block 132
BBED> set dba 11,133
DBA 0x02c00085 (46137477 11,133)
--//注:windows下bbed存在+1的偏移.
BBED> x /rnxx *kdbr[1]
rowdata[44] @8140
-----------
flag@8140: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8141: 0x01
cols@8142: 3
col 0[2] @8143: 20
col 1[8] @8146: 0x52 0x45 0x53 0x45 0x41 0x52 0x43 0x48
col 2[6] @8155: 0x44 0x41 0x4c 0x4c 0x41 0x53
--//如果能有一种方式实现快速知道或者显示对应字符串,能大大提高分析处理问题的工作效率。
--//我经常使用vim自带xxd实现类似的功能,加入-r参数就是反向操作,因为前面没有偏移量必须加入-ps(我的测试-p也是ok的)。
424f4f54535452415024
--//具体操作如下,移动到上面一行,直接输入
--//缺点就是覆盖原来的显示。注意xxd要在PATH路径访问中。我个人的工作习惯将一些常用的小命令拷贝到D:\tools\short目录下。
--//然后将D:\tools\short加入到PATH环境变量中。
--//经常打入不是非常方便,在vim下可以定义如下快捷,放入_vimrc.vim配置文件中,注我一般会定义一个文件(xxd.vim)单独保存:
--//这样避免覆盖.
noremap
vnoremap ;xxd "ay
--//这样执行\xxd,显示如下:"
424f4f54535452415024 = BOOTSTRAP$
0x52 0x45 0x53 0x45 0x41 0x52 0x43 0x48 = RESEARCH
--//上面几种格式都可以处理:
0x42 0x4F 0x54 0x53 0x54 0x52 0x41 0x50 0x24 = BOTSTRAP$
0x42,0x4F,0x54,0x53,0x54,0x52,0x41,0x50,0x24 = BOTSTRAP$
42,4f,4f,54,53,54,52,41,50,24 = BOOTSTRAP$
424f4f54535452415024 = BOOTSTRAP$
--//也可以这样操作,按v或者V,选中文本,进入v模式,然后打入;xxd.
--//提醒一下,如果使用shift+方向键选择的进入的是"选择模式",按ctrl+g就可以切换为"可视模式",再打入;xxd就会得到如下显示效果:
col 1[8] @8146: 0x52 0x45 0x53 0x45 0x41 0x52 0x43 0x48
0x52 0x45 0x53 0x45 0x41 0x52 0x43 0x48 = RESEARCH
SQL> select dump('BOOTSTRAP$',16) from dual;
DUMP('BOOTSTRAP$',16)
--------------------------------------------
Typ=96 Len=10: 42,4f,4f,54,53,54,52,41,50,24
42,4f,4f,54,53,54,52,41,50,24 = BOOTSTRAP$
3.命令行执行方式:
--//另外也可以在命令行上执行:
d:\> echo 42,4f,4f,54,53,54,52,41,50,24 | xxd -r -p
BOOTSTRAP$
d:\>echo 0x42,0x4F 0x54 0x53 0x54 0x52 0x41 0x50 0x24 | xxd -r -p
BOTSTRAP$
4.更复杂的情况:
--//如果看intel cpu系列服务器的内存转储,存在一个大小头问题,高字节显示在前面,低字节在后面,4个4个颠倒。
--//举一个数据块的转储例子:
SCOTT@test01p> alter system dump datafile 11 block 132;
System altered.
--//检查转储文件内容:
...
001992FA0 0203012C 4F0A29C1 41524550 4E4F4954 [,....).OPERATION]
001992FB0 4F420653 4E4F5453 0203012C 53051FC1 [S.BOSTON,......S]
001992FC0 53454C41 49484307 4F474143 0203012C [ALES.CHICAGO,...]
001992FD0 520815C1 41455345 06484352 4C4C4144 [...RESEARCH.DALL]
001992FE0 012C5341 0BC10203 4343410A 544E554F [AS,......ACCOUNT]
001992FF0 08474E49 2057454E 4B524F59 E9040601 [ING.NEW YORK....]
...
Block header dump: 0x02c00084
Object id on Block? Y
seg/obj: 0x57d7 csc: 0x000000000010e8fb itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2c00080 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.014.00000149 0x01806275.0033.5a --U- 4 fsc 0x0000.0010e904
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
bdba: 0x02c00084
data_block_dump,data header at 0x1991064
===============
tsiz: 0x1f98
hsiz: 0x1a
pbl: 0x01991064
76543210
flag=--------
ntab=1
nrow=4
frre=-1
fsbo=0x1a
fseo=0x1f3c
avsp=0x1f22
tosp=0x1f22
0xe:pti[0] nrow=4 offs=0
0x12:pri[0] offs=0x1f7e
0x14:pri[1] offs=0x1f68
0x16:pri[2] offs=0x1f54
0x18:pri[3] offs=0x1f3c
block_row_dump:
tab 0, row 0, @0x1f7e
tl: 26 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [ 2] c1 0b
col 1: [10] 41 43 43 4f 55 4e 54 49 4e 47
--//41 43 43 4f 55 4e 54 49 4e 47 = ACCOUNTING,选中然后打入;xxd,ok!!
col 2: [ 8] 4e 45 57 20 59 4f 52 4b
tab 0, row 1, @0x1f68
tl: 22 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [ 2] c1 15
col 1: [ 8] 52 45 53 45 41 52 43 48
col 2: [ 6] 44 41 4c 4c 41 53
--//再增加如下快捷:
noremap
vnoremap ;xx4 "ay
--//注意 管道|前要打入\,转义一下。测试":
001992FA0 0203012C 4F0A29C1 41524550 4E4F4954 [,....).OPERATION]
001992FB0 4F420653 4E4F5453 0203012C 53051FC1 [S.BOSTON,......S]
001992FC0 53454C41 49484307 4F474143 0203012C [ALES.CHICAGO,...]
001992FD0 520815C1 41455345 06484352 4C4C4144 [...RESEARCH.DALL]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
001992FE0 012C5341 0BC10203 4343410A 544E554F [AS,......ACCOUNT]
001992FF0 08474E49 2057454E 4B524F59 E9040601 [ING.NEW YORK....]
--//测试下划线内容:
--//截取下划线内容为一行,打入\xx4显示如下:
520815C1 41455345 06484352 4C4C4144 = ?RESEARCHDALL
--//对比前面的显示基本一致.
--//测试;xx4
001992FE0 012C5341 0BC10203 4343410A 544E554F [AS,......ACCOUNT]
012C5341 0BC10203 4343410A 544E554F = AS,?
ACCOUNT
--//按小写v选中012C5341到544E554F,打入;xx4,显示如上,因为里面有0A(回车),这样ACCOUNT显示在下一行.
001992FF0 08474E49 2057454E 4B524F59 E9040601 [ING.NEW YORK....]
08474E49 2057454E 4B524F59 E9040601 = INGNEW YORK?
--//如果想看^H表示什么可以一定要该字符按ga,提示行显示:
<^H> 8, 十六进制 08, 八进制 010
5.总结
--//最终修改如下:
$ cat xxd.vim
noremap
vnoremap ;xxd "ay
noremap
vnoremap ;xx4 "ay
--//修改_vimrc.vim配置,加入":
source c:\vim\vim73\xxd.vim
--//这样可以快速查看实际的内容,提供工作效率.