一、二進制串進行Base編碼步驟
-
首先將二進制串劃分每5位一組,不足5位補0。
-
然後將各組的5位二進制串轉成十進制(5bits對應着10進制的數值爲0-31)。
-
用0-9、b-z(去掉a、i、l、o)這32個字母進行Base32編碼,即對照下標將其轉換爲字符串。
base32編碼.png
二、舉例如何對位置編碼得到字符串
舉例說明,我們如何對北海公園的位置(緯度39.928167,精度116.389550)編碼
第一步:經緯度分別編碼
地球緯度區間是[-90,90], 北海公園的緯度是39.928167,可以通過下面算法對緯度39.928167進行逼近編碼:
1)區間[-90,90]進行二分爲[-90,0),[0,90],稱爲左右區間,可以確定39.928167屬於右區間[0,90],給標記爲1;
2)接着將區間[0,90]進行二分爲 [0,45),[45,90],可以確定39.928167屬於左區間 [0,45),給標記爲0;
3)遞歸上述過程39.928167總是屬於某個區間[a,b]。隨着每次迭代區間[a,b]總在縮小,並越來越逼近39.928167;
4)如果給定的緯度x(39.928167)屬於左區間,則記錄0,如果屬於右區間則記錄1,這樣隨着算法的進行會產生一個序列1011100,序列的長度跟給定的區間劃分次數有關。
根據緯度算編碼
bit | min | mid | max |
---|---|---|---|
1 | -90.000 | 0.000 | 90.000 |
0 | 0.000 | 45.000 | 90.000 |
1 | 0.000 | 22.500 | 45.000 |
1 | 22.500 | 33.750 | 45.000 |
1 | 33.7500 | 39.375 | 45.000 |
0 | 39.375 | 42.188 | 45.000 |
0 | 39.375 | 40.7815 | 42.188 |
0 | 39.375 | 40.07825 | 40.7815 |
1 | 39.375 | 39.726625 | 40.07825 |
1 | 39.726625 | 39.9024375 | 40.07825 |
同理,地球經度區間是[-180,180],可以對經度116.389550進行編碼。
根據經度算編碼
bit | min | mid | max |
---|---|---|---|
1 | -180 | 0.000 | 180 |
1 | 0.000 | 90 | 180 |
0 | 90 | 135 | 180 |
1 | 90 | 112.5 | 135 |
0 | 112.5 | 123.75 | 135 |
0 | 112.5 | 118.125 | 123.75 |
1 | 112.5 | 115.3125 | 118.125 |
0 | 115.3125 | 116.71875 | 118.125 |
1 | 115.3125 | 116.015625 | 116.71875 |
1 | 116.015625 | 116.3671875 | 116.71875 |
第二步:奇偶合並和編碼:
過上述計算,緯度產生的編碼爲10111 00011
,經度產生的編碼爲11010 01011
。偶數位放緯度,奇數位放經度,把2串編碼組合生成新串:11100 11101 00100 01111
。
最後使用用0-9
、b-z
(去掉a, i, l, o)這32個字母進行base32
編碼,首先將11100 11101 00100 01111
轉成十進制,對應着28、29、4、15,十進制對應的編碼就是wx4g
。同理,將編碼轉換成經緯度的解碼算法與之相反,具體不再贅述。