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

时间:2014-09-28 10:26:29

标签: javascript math base

我需要使用JavaScript将基本62值(如4u8LPK581OHn7kRqRqP9ks)转换为16。使用php based tool,我可以看到结果应为A12D08BC6D93BC4E8EA847434C960416。

查看一些像base62这样的npm结节,我想我可以将值取为10,然后通过toString转换为base 16,就像这个Base62.decode('4u8LPK581OHn7kRqRqP9ks')。toString(16)。

但是,由于基数62的值很大,JavaScript希望用科学记数法表示它,它将转换到基数10,最后是16。

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

有没有人有其他方法的建议?

2 个答案:

答案 0 :(得分:0)

使用bigint并自己解码我认为单个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进行unsigned int转换
  • 因为char已签名所以如果没有它,解码条件可能会出错......
  • alphabet is from here

答案 1 :(得分:0)

我在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