【问题标题】:Converting a large base 62 value to base 16 with JavaScript使用 JavaScript 将大的 base 62 值转换为 base 16
【发布时间】:2014-11-22 21:41:57
【问题描述】:

我需要使用 JavaScript 将 4u8LPK581OHn7kRqRqP9ks 等基数为 62 的值转换为基数 16。使用php based tool,我可以看到结果应该是 A12D08BC6D93BC4E8EA847434C960416。

看着像base62 这样的一些 npm 结节,我想我可以将值设为基数 10,然后通过 toString 转换为基数 16,例如 Base62.decode('4u8LPK581OHn7kRqRqP9ks').toString(16)。

但是,由于基数 62 的值很大,JavaScript 想要使用科学记数法来表示它,这将转换为基数 10,最后是基数 16。

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

有人对替代方法有建议吗?

【问题讨论】:

  • 你试过这个吗:npmjs.org/package/bases
  • 是的,但我遇到了同样的问题。 12 个字符后,JS 切换到科学计数法并抛出结果。

标签: javascript math base


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 2013-09-21
      • 2013-01-24
      • 2012-07-08
      • 2013-03-05
      • 2013-01-06
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多