[20190819]如何快速轉換16進位制串到字串.txt

lfree發表於2019-08-20

[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

--//這樣可以快速檢視實際的內容,提供工作效率.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2654338/,如需轉載,請註明出處,否則將追究法律責任。

相關文章