使用JavaScript将大的基数62值转换为基数16

Converting a large base 62 value to base 16 with JavaScript

本文关键字:转换 JavaScript 使用      更新时间:2023-09-26

我需要使用JavaScript将基数62的值(如4u8LPK581OHn7kRqRqP9ks)转换为基数16。使用基于php的工具,我可以看到结果应该是A12D08BC6D93BC4E8EA847434C960416。

看到一些像base62这样的npm结节,我想我可以把值取到基数10,然后通过像base62.decode这样的toString转换到基数16('4u8LPK581OHn7kRqRqP9ks').toString(16).

然而,由于基数62的值很大,JavaScript希望使用科学记数法来表示它,该记数法将转换为基数10,最后是基数16。

我尝试使用javascript biginteger来解析基数62的值。但是parse()将基数限制为2-32。

有人对另一种方法有建议吗?

使用biint并自己解码。我认为单for循环对的编码并不难

不是JAVA编码器,所以我坚持使用C++/伪代码:

//base62Alphabet[] = {a,b,c,...,A,B,C,...,0,1,2,...};
bigint out;
char in[]="4u8LPK581OHn7kRqRqP9ks'0";
int i,d;
for (out=0,i=0;in[i];i++)
 {
 out*=62;
 d=unsigned int(in[i]);
 // here convert d from char to value from alphabet
 // for example i found this base62Alphabet in that case
 // (more common is that numbers are first instead of last)
      if (d<unsigned int('A')) d+= 0-'a';
 else if (d<unsigned int('0')) d+=26-'A';
 else                            d+=52-'0';
 out+=d;
 }
// here out should hold your value
// so just print it in hex (bigint libs should have some function for that)
// or code it yourself it is similar code but instead *=62 you div/mod by 16

【注释】

  • 这应该适用于MSB第一个表示法(最有效的数字在左边的第一个)
  • 还要检查你的数字使用的字母表,并相应地更改代码
  • 在某些平台上,从char进行无符号int转换是必要的
  • 因为char是有符号的,所以如果没有它,解码条件可能会出错
  • 字母表是从这里来的

我为JS中的泛型基数转换编写了一个库,这可能对您有所帮助。https://github.com/cflynn07/power-radix

节点REPL 中的快速示例

> var PowerRadix = require('./lib/index');
undefined
> var base16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];
undefined
> new PowerRadix('4u8LPK581OHn7kRqRqP9ks', 62).toArray(base16)
[ 'A',
  1,
  2,
  'D',
  0,
  8,
  'B',
  'C',
  6,
  'D',
  9,
  3,
  'B',
  'C',
  4,
  'E',
  8,
  'E',
  'A',
  8,
  4,
  7,
  4,
  3,
  4,
  'C',
  9,
  6,
  0,
  4,
  1,
  6 ]
> new PowerRadix('4u8LPK581OHn7kRqRqP9ks', 62).toString(base16)
'A12D08BC6D93BC4E8EA847434C960416'

我需要添加额外的文档+测试来显示这一点,但您也可以将任何值的数组作为第二个参数传递给构造函数,作为源基数。例如:

var base16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];
> new PowerRadix('4u8LPK581OHn7kRqRqP9ks', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')).toString(base16);
'A12D08BC6D93BC4E8EA847434C960416'

编辑
添加了示例测试:
https://github.com/cflynn07/power-radix/blob/v2.3.0/test/index.spec.js#L197