尝试以 base 64 编码来自 javaScript 中的 BigInteger 的字节数组
Trying to encode in base 64 a byte array from a BigInteger in javaScript
我正在尝试在 java 脚本中实现完全相同的 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);
这可能吗,因为 java脚本不能像 java BigInteger/long 那样处理大数字?有什么图书馆推荐吗?
您或许可以尝试类似的方法:
// 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 长数据类型的最大值为 2^63 - 1
(primitive data type) while the javascript number has a maximum value of 2^53 - 1
(Number.MAX_SAFE_INTEGER)。
所以在 java 脚本中你将无法处理 9007199254740991 2^63 - 1
和 9223372036854775807 2^53 - 1
之间的数字,而在 java 中你可以。
我正在尝试在 java 脚本中实现完全相同的 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);
这可能吗,因为 java脚本不能像 java BigInteger/long 那样处理大数字?有什么图书馆推荐吗?
您或许可以尝试类似的方法:
// 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 长数据类型的最大值为 2^63 - 1
(primitive data type) while the javascript number has a maximum value of 2^53 - 1
(Number.MAX_SAFE_INTEGER)。
所以在 java 脚本中你将无法处理 9007199254740991 2^63 - 1
和 9223372036854775807 2^53 - 1
之间的数字,而在 java 中你可以。