[20190819]如何快速转换16进制串到字符串.txt

来源:这里教程网 时间:2026-03-03 14:07:49 作者:

[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 --//具体操作如下,移动到上面一行,直接输入<ESC>!!xxd -r -p<CR>,这样上面的内容就显示为BOOTSTRAP$. --//缺点就是覆盖原来的显示。注意xxd要在PATH路径访问中。我个人的工作习惯将一些常用的小命令拷贝到D:\tools\short目录下。 --//然后将D:\tools\short加入到PATH环境变量中。 --//经常打入不是非常方便,在vim下可以定义如下快捷,放入_vimrc.vim配置文件中,注我一般会定义一个文件(xxd.vim)单独保存: --//这样避免覆盖. noremap  <leader>xxd Yp!!xxd -r -p<CR>kA = <ESC>J vnoremap  ;xxd       "ay<ESC>o<ESC>"apo<ESC>"ap!!xxd -r -p<CR>kA = <ESC>J --//这样执行\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  <leader>xx4 Yp!!xxd -r -p \|od -t x4 \| xxd -r<CR>kA = <ESC>J vnoremap  ;xx4       "ay<ESC>o<ESC>"apo<ESC>"ap!!xxd -r -p\|od -t x4 \| xxd -r<CR>kA = <ESC>J --//注意 管道|前要打入\,转义一下。测试": 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  <leader>xxd Yp!!xxd -r -p<CR>kA = <ESC>J vnoremap  ;xxd       "ay<ESC>o<ESC>"apo<ESC>"ap!!xxd -r -p<CR>kA = <ESC>J noremap  <leader>xx4 Yp!!xxd -r -p \|od -t x4 \| xxd -r<CR>kA = <ESC>J vnoremap  ;xx4       "ay<ESC>o<ESC>"apo<ESC>"ap!!xxd -r -p\|od -t x4 \| xxd -r<CR>kA = <ESC>J --//修改_vimrc.vim配置,加入": source c:\vim\vim73\xxd.vim --//这样可以快速查看实际的内容,提供工作效率.

相关推荐