如何将大整数拆分为8位整数数组

时间:2018-11-20 22:30:35

标签: javascript c integer

想知道如何将1123455324617851000199519157之类的任意大小的整数的输出转换为整数数组。

[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这样的命令性语言。

我非常确定数组的长度也应该相同,但是如果不可能,那么就可以知道如何以不同的方式来做。

2 个答案:

答案 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)

毫无疑问,可以找到一些效率(也许可以避免使用临时数组)。