一、簡介
Base-x是一個實現不同進制數之間的轉換的JavaScript庫。它可以將16進制的字符串轉換為二進制、八進制、十進制等其他任意進制的字符串。這個庫實現的主要思路是利用了JavaScript中的BigInt類型,可以處理更大範圍的數字。目前,Base-x支持Base2 ~ Base62的轉換。
二、原理
在計算機科學中,base-x就是將數字轉換為一個X進制的數字系統。在這個數字系統中,數字0表示第0位,數字1表示第1位,數字2表示第2位,以此類推。我們通常使用的十進制數字系統是將數字分解成10的冪的形式,比如數值203,可以寫作2*10^2 + 0*10^1 + 3*10^0,其中的10就是十進制。
因此,數字在不同進制數之間的轉換,本質上就是要將數字表示成另一種進制數的形式。這裡介紹的是將數字轉換為字符串的形式。使用Base-x進行轉換,需要確定兩個參數:要將數字轉換成的基數(即進制),和要轉換的數字。然後,就可以使用一些特殊的函數將數字轉換為目標進制下的字符串。
三、使用方法
1、安裝
npm install base-x
2、基本示例
下面是一個簡單示例,將一個任意進制的數轉換為目標進制的字符串:
const baseX = require('base-x')
const bs16 = baseX('0123456789abcdef') // 創建一個可以轉換成16進制的實例,輸入字符串中包含了16個字符
const buffer = Buffer.from('hello world')
const str16 = bs16.encode(buffer) // 將buffer對象轉換成hex字符串
console.log(str16) // 68656c6c6f20776f726c64
const bytes = bs16.decode(str16) // 將hex字符串轉換成buffer對象
console.log(bytes.toString()) // hello world
3、常用API
encode(raw: ArrayLike<byte>): string
將輸入的原生數組對象轉換成一個字符串,其按照當前對象所定義的進制方式進行轉換。這裡的byte值會從Base-x實例初始化的時候設置的編碼表中查找。
decode(encoded: string): Uint8Array
將給定的字符串解碼為一個數字數組,並按照當前對象所定義的進制方式進行解碼。這裡的數字數組會將byte值從Base-x實例初始化的時候設置的編碼表中查找。
4、實現原理
Base-x的實現,主要依賴於下面兩個重要的函數:
// 將原生數組轉換為BigInt類型的數字
function decodeUnsafe(val: ArrayLike<byte>): bigint {
let res = BigInt(0)
// 從右向左進行遍歷
for (let i = 0; i < val.length; i++) {
res = res * BigInt(BASE) + BigInt(val[i])
}
return res
}
// 將BigInt數字轉換為字符串
function encode(val: number | bigint | ArrayLike<byte>): string {
if (typeof val === 'number' || typeof val === 'bigint') {
val = Buffer.from(val.toString(16), 'hex')
}
if (isBuffer(val)) return encode.buffer(val)
return fromBigInt(decodeUnsafe(val))
}
在這兩個函數中,decodeUnsafe()函數主要實現了將輸入的原生數組轉換為BigInt類型的數字,同時定義了進制的基數。該函數依靠循環和BigInt類型的運算,將每一位的數字依次拼接起來,最終得到一個BigInt類型的數字表示。
encode()函數則是將BigInt類型的數字再轉換回字符串。該函數實現了將BigInt類型的數字拆分成各個位的數字,依次從編碼表中查找與之對應的字符,最終得到字符串表示。
參考資料
- Base-x官網:https://github.com/cryptocoinjs/base-x#readme
- Hexadecimal數字系統:https://en.wikipedia.org/wiki/Hexadecimal
- JavaScript中的BigInt類型:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
原創文章,作者:KPZDA,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/361511.html