[20190819]如何快速轉換16進位制串到字串.txt
[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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C# 解析16進位制字串。將16進位制字串轉換成明文字串C#字串
- 16進位制字串轉位元組字串
- 位元組流轉16進位制字串字串
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- [20190716]十進位制轉換其他進位制指令碼.txt指令碼
- 資料轉換-16進位制字元字元
- oracle_16進位制與10進位制轉換小示例Oracle
- Java 16進位制字串 取反Java字串
- Qt進位制轉換(十進位制轉十六進位制)QT
- JavaScript RGB轉換成16進位制顏色JavaScript
- 僅做筆記用:base64字串轉換為十六進位制形式表示的二進位制資料筆記字串
- 進位制轉換
- 什麼是二進位制?二進位制如何轉換?
- PHP負數轉16進位制再轉到10進位制的正確姿勢PHP
- 教你如何進行數倉字串、二進位制、十六進位制互轉字串
- [20220304]使用gdb完成各種進位制轉換.txt
- 二進位制轉十進位制快速方法
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- JavaScript 進位制轉換JavaScript
- 【python】進位制轉換Python
- 進位制的轉換
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- C++資料格式化5 - uint轉換成十六進位制字串&二進位制的data列印成十六進位制字串C++UI字串
- JavaScript十進位制轉換為二進位制JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- WebSocket系列之JavaScript字串如何與二進位制資料間進行互相轉換WebJavaScript字串
- 進位制與二進位制及相關轉換
- 進位制轉換圖解圖解
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 負數補碼(16進位制轉10進位制的負數)
- 十進位制轉換任意進位制--鏈棧實現
- 計算機求解10進位制轉換任意進位制計算機
- JavaScript中的多種進位制與進位制轉換JavaScript
- [C/C++11]_[初級]_[如何轉換帶井號的#十六進位制顏色字串到數值]C++字串
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制