Base-x:實現不同進位數之間的轉換

一、簡介

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類型的數字拆分成各個位的數字,依次從編碼表中查找與之對應的字元,最終得到字元串表示。

參考資料

原創文章,作者:KPZDA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/361511.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KPZDA的頭像KPZDA
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

發表回復

登錄後才能評論