[20191011]bash任意進位制編碼表.txt
[20191011]bash任意進位制編碼表.txt
--//bash可以使用任意進位制編碼轉化為十進位制.我想了解內部編碼:
--//實際上受字符集的限制,"任意"進位制有限制的.測試看看最大是多少.
1.input base最大支援多少.
$ echo $((16#F))
15
$ echo $((16#f))
15
--//說明:前面16表示16進位制,F表示編碼,結果輸出10進位制 15.
--//注意看大小寫輸出都是15.說明16進位制編碼 0-9,a-f 或者0-9,A-F.
$ echo $((64#F))
41
$ echo $((65#F))
-bash: 65#F: invalid arithmetic base (error token is "65#F")
--//65進位制不支援.從這裡看出ibase最大是64.看看64進位制編碼情況如何?
2.看看64進位制編碼:
$ echo $((64#1))
1
$ echo $((64#a))
10
$ echo $((64#A))
36
--//可以大概猜測bash 64進位制編碼從0開始. 0-9 , a-z , A-Z.這樣僅僅62個編碼.還剩下2個.
--//經常反覆測試,你也可以寫指令碼測試.
$ echo $((64#@))
62
$ echo $((64#_))
63
--//這樣完整的編碼如下:
$ base64=$(echo {0..9} {a..z} {A..Z} @ _)
$ echo $base64
0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z @ _
--//定義成bash陣列如下:
$ BASE64=($(echo {0..9} {a..z} {A..Z} @ _))
$ echo ${BASE64[*]}
0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z @ _
--//其它進位制僅僅編碼縮短,估計在36進位制以內大小寫可以混用.測試如下:
$ echo $((36#A))
10
$ echo $((36#a))
10
$ echo $((36#aA))
370
--//大小寫混合沒問題.在36進位制以內.
$ echo $((37#a))
10
$ echo $((37#A))
36
--//36進位制下大小寫輸入一致.而37進位制就不是這樣的情況了.
3.為什麼要了解這些?
--//有了bash 64進位制碼錶,我就可以使用bash轉換oracle rowid的相關資訊,雖然oracle rowid也是64進位制編碼,但是編碼排列不一樣.
--//而透過bash很容易轉化成對應的10進位制:
--//比如:
SCOTT@test01p> select rowid ,t1.* from t1 where id in (63,64);
ROWID ID T1NAME
------------------ ---------- ----------------------
AAAG2DAALAAAADDAA+ 63 t10000000063
AAAG2DAALAAAADDAA/ 64 t10000000064
SCOTT@test01p> @ rowid AAAG2DAALAAAADDAA+
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
28035 11 195 62 0x2C000C3 11,195 alter system dump datafile 11 block 195
--//rowid前6位是data_object_id. AAAG2D.
--//Rowid採用64位進位制編碼,編碼如下:
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
--//碼錶就是 echo {A..Z} {a..z} {0..9} +/ | tr -d " "
$ echo AAAG2D | tr $( echo {A..Z} {a..z} {0..9} +/ | tr -d " ") $( echo {0..9} {a..z} {A..Z} @ _| tr -d " ")
0006S3
$ echo $((64#0006S3))
28035
--//完成能對上.再來看看block號=AAAADD.
$ echo $(( 64#$( echo AAAADD | tr $( echo {A..Z} {a..z} {0..9} +/ | tr -d " ") $( echo {0..9} {a..z} {A..Z} @ _| tr -d " ")) ))
195
$ echo $(( 64#$( echo AA+ | tr $( echo {A..Z} {a..z} {0..9} +/ | tr -d " ") $( echo {0..9} {a..z} {A..Z} @ _| tr -d " ")) ))
62
$ echo $(( 64#$( echo AA/ | tr $( echo {A..Z} {a..z} {0..9} +/ | tr -d " ") $( echo {0..9} {a..z} {A..Z} @ _| tr -d " ")) ))
63
--//也能對上.還可以使用這個將sql_id 推匯出 hash_value.比如:
--//連結:http://blog.itpub.net/267265/viewspace-2142512/
select * from emp where deptno=10;
--//查詢可以知道sql_id='557p4j1ggw222'.
SCOTT@book> select sql_text c70,sql_id,hash_value from v$sql where sql_id = '557p4j1ggw222';
C70 SQL_ID HASH_VALUE
---------------------------------- ------------- ----------
select * from emp where deptno=10 557p4j1ggw222 1593706562
SCOTT@book> select name c70,hash_value,full_hash_value from V$DB_OBJECT_CACHE where name like '%emp%' and hash_value=1593706562;
C70 HASH_VALUE FULL_HASH_VALUE
--------------------------------- ---------- --------------------------------
select * from emp where deptno=10 1593706562 8bb974871a4f8c88529ea4885efe0842
select * from emp where deptno=10 1593706562 8bb974871a4f8c88529ea4885efe0842
--//sql_id=557p4j1ggw222,sql_id採用32進位制,編碼是0-9,a-z .沒有eilo這4個字元,正好32個.我以前提過去掉eilo主要目的是這些看起來像數字0,1.
$ echo $(( 32#$( echo 557p4j1ggw222 | tr $( echo {0..9} {a..z} | tr -d "eilo ") $( echo {0..9} {a..v} | tr -d " ")) ))
5953376663046588482
$ echo "obase=16;5953376663046588482" | bc -lq
529EA4885EFE0842
$ echo "obase=10;ibase=16;5EFE0842" | bc -lq
1593706562
--//輸出10進位制 5953376663046588482 轉化16進位制是 0x529ea4885efe0842,後8位0x5e5efe0842(16進位制)就是hash_value.
--//0x5efe0842 = 1593706562
--//正好與輸出的HASH_VALUE能對上.
4.附上rowid指令碼如下:
$ cat rowid.sql
set verify off
column dba format a20
column text format a40
SELECT DBMS_ROWID.ROWID_OBJECT ('&1') "OBJECT",
DBMS_ROWID.ROWID_RELATIVE_FNO ('&1') "FILE",
DBMS_ROWID.ROWID_BLOCK_NUMBER ('&1') "BLOCK",
DBMS_ROWID.ROWID_ROW_NUMBER ('&1') "ROW",
lpad('0x'||trim(to_char(dbms_utility.MAKE_DATA_BLOCK_ADDRESS(dbms_rowid.ROWID_RELATIVE_FNO('&1'),dbms_rowid.ROWID_BLOCK_NUMBER('&1')), 'XXXXXXXX')), 10) rowid_dba,
DBMS_ROWID.ROWID_RELATIVE_FNO ('&1')
|| ','
|| DBMS_ROWID.ROWID_BLOCK_NUMBER ('&1')
"DBA",
'alter system dump datafile '
|| DBMS_ROWID.ROWID_RELATIVE_FNO ('&1')
|| ' block '
|| DBMS_ROWID.ROWID_BLOCK_NUMBER ('&1')
|| ' ;'
text
FROM DUAL;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2659612/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20190716]十進位制轉換其他進位制指令碼.txt指令碼
- 計算機求解10進位制轉換任意進位制計算機
- 十進位制轉換任意進位制--鏈棧實現
- [20191011]通過bash計算sql語句的sql_id.txtSQL
- 資料結構–進位制(任意)轉換資料結構
- 【Redis】原始碼編譯二進位制包Redis原始碼編譯
- 彙編實現10進位制轉16進位制並以ASCII碼輸出ASCII
- 任意進位制下的可逆素數 C++C++
- [20191011]拆分rowid 2.txt
- C++實現任意進位制的相互轉換C++
- 進位制詳解:二進位制、八進位制和十六進位制
- [20210107]編寫bash shell指令碼遇到的問題.txt指令碼
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- ASCII碼是幾位二進位制碼?ASCII
- Java實現BCD編碼與十進位制轉換Java
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- Qt進位制轉換(十進位制轉十六進位制)QT
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 二進位制反碼求和
- n進位制轉十進位制
- 10進位制 VS 2進位制
- 十進位制轉十六進位制
- 負數補碼(16進位制轉10進位制的負數)
- 二進位制、十進位制與十六進位制相互轉化
- [20220304]使用gdb完成各種進位制轉換.txt
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 十進位制——二 (八、十六 )進位制
- 關於10進位制轉2進位制的C語言程式碼C語言
- Python字元編碼和二進位制不得不說的故事Python字元
- 進位制
- 二進位制與二進位制運算
- 二進位制轉十進位制快速方法