想知道如何将1
或12345
或5324617851000199519157
之类的任意大小的整数的输出转换为整数数组。
[1] // for the first one
// [probably just a few values for the second 12345...]
[1, 123, 255, 32, ...] // not sure here...
我不确定结果值是什么样子或如何计算,但不知何故是这样的:
一堆8位数字,可用于重建(以某种方式)原始任意整数。我也不知道要进行什么计算。但是我所知道的是,每个唯一的任意大小的整数都应导致一个唯一的8位值数组。也就是说,两个不同的日期整数都不应产生相同的数组。
语言的实现方式并不重要,但可能是诸如JavaScript或C这样的命令性语言。
我非常确定数组的长度也应该相同,但是如果不可能,那么就可以知道如何以不同的方式来做。
答案 0 :(得分:1)
大多数语言,包括C和Javascript,都将位移和位掩码操作作为其基本数学运算的一部分。但要注意Javascript:数字是64位,但只允许32位屏蔽操作。所以:
let bignum = Date.now();
let hi = Math.floor(bignum / 0x100000000),
lo = bignum & 0xFFFFFFFF,
bytes = [
(hi >> 24) & 0xFF,
(hi >> 16) & 0xFF,
(hi >> 8) & 0xFF,
hi & 0xFF,
(lo >> 24) & 0xFF,
(lo >> 16) & 0xFF,
(lo >> 8) & 0xFF,
lo & 0xFF
];
答案 1 :(得分:1)
我不确定这是否对您想要的太暴力了,但是您可以采用任意字符串,然后将长整除成unit8Array
。
这是一个函数(从here自由借用),它将从任意长的字符串来回转换:
function eightBit(str){
let dec = [...str], sum = []
while(dec.length){
let s = 1 * dec.shift()
for(let i = 0; s || i < sum.length; i++){
s += (sum[i] || 0) * 10
sum[i] = s % 256
s = (s - sum[i]) / 256
}
}
return Uint8Array.from(sum.reverse())
}
function eightBit2String(arr){
var dec = [...arr], sum = []
while(dec.length){
let s = 1 * dec.shift()
for(let i = 0; s || i < sum.length; i++){
s += (sum[i] || 0) * 256
sum[i] = s % 10
s = (s - sum[i]) / 10
}
}
return sum.reverse().join('')
}
// sanity check
console.log("256 = ", eightBit('256'), "258 = ", eightBit('258'))
let n = '47171857151875817758571875815815782572758275672576575677'
let a = eightBit(n)
console.log("to convert:", n)
console.log("converted:", a.toString())
let s = eightBit2String(a)
console.log("converted back:", s)
毫无疑问,可以找到一些效率(也许可以避免使用临时数组)。