【问题标题】:Trying to encode in base 64 a byte array from a BigInteger in javaScript尝试以 64 进制编码来自 javaScript 中 BigInteger 的字节数组
【发布时间】:2017-04-06 13:51:48
【问题描述】:

我正在尝试在 javaScript 中实现完全相同的 java 算法:

String s = "6332878812086272"; // For example
long id = Long.valueOf(s);
final byte[] idBytes = BigInteger.valueOf(id).toByteArray();
final String idBase64 = Base64.getEncoder().encodeToString(idBytes);

这可能是因为 javaScript 不能像 java BigInteger/long 这样处理大数字吗?有什么图书馆推荐吗?

【问题讨论】:

    标签: javascript arrays encoding base64 biginteger


    【解决方案1】:

    你也许可以尝试这样的事情:

    // number -> number in base 2 as string
    var nbrAsBits = (6332878812086272).toString(2); //"10110 01111111 10111000 01000000 00000000 00000000 00000000"
    
    // number in base 2 as string -> array of bytes (8 bits) as numbers
    var nbrAsIntArray = convertionTool(nbrAsBits); //[22, 127, 184, 64, 0, 0, 0]
    
    // array of bytes as numbers -> bytes
    var nbrAsByteArray= new Uint8Array(bytes);
    
    // concat everything in a string
    var str = "";
    for(var i=0; i<byteArray.length; i++) {
        str += String.fromCharCode(byteArray[i]);
    }
    
    // get the base64
    btoa(str); //"Fn+4QAAAAA=="
    

    您必须实现convertionTool() 函数,它将每个字节转换为其数值。在这个例子中使用 2 的幂:

    01111111 = 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 127

    注意

    java long 数据类型的最大值为2^63 - 1 (primitive data type),而javascript number 的最大值为2^53 - 1 (Number.MAX_SAFE_INTEGER)。

    所以在 javascript 中你将无法处理 9007199254740991 2^63 - 1 和 9223372036854775807 2^53 - 1 之间的数字,而在 java 中你可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      相关资源
      最近更新 更多