首页 > 解决方案 > 如何将大整数拆分为 8 位整数数组

问题描述

想知道如何将任意大小的整数(如1or12345或 or )的输出转换为整数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 这样的命令式语言。

我很确定数组也应该具有相同的长度,但是如果这不可能,那么知道如何以不同的方式进行操作就可以了。

标签: javascriptcinteger

解决方案


我不确定这对于您想要的是否过于暴力,但是您可以使用任意字符串并将长除法转换为unit8Array.

这是一个函数(从这里大量借用),它将从任意长的字符串来回转换:

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)

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


推荐阅读