Как разбить большое целое на массив 8-битных целых - PullRequest
0 голосов
/ 21 ноября 2018

Хотите знать, как преобразовать вывод целых чисел произвольного размера, таких как 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.

Я почти уверен, что все массивы должны быть одинаковой длины, но если это невозможно, то знать, как это сделать по-другому, было бы хорошо.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я не уверен, если это слишком грубо для того, что вы хотите, но вы можете взять произвольную строку и просто сделать длинное деление на 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)

Без сомнения, есть некоторые преимущества (возможно, вы можете избежать промежуточных массивов).

0 голосов
/ 21 ноября 2018

Большинство языков, включая 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
    ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...