Цитата:
И еще решить, как хранить младший байт первым или старший. В примере выше, в Uint8Array первым идет старший байт. Но не уверен, что это правильно. ЗЫ Посмотрев всякие материалы убедился, что именно так правильно (первыми идут старшие байты). Такой порядок обычно применяется при передаче по сети и межкомпьютерного обмена данными. |
Цитата:
// выведет 00101101011000001010000001010100100100110010011001 01011100110011111111110011100000000000001011001001 10111000000011010011010110011101110111011001011100 00011111111001100011110001110001110010110011100011 10001111000010001111101110110000010101111110011011 101110 (256 бит = 32 байта) ЗЫ Понятное дело, что hex-строка может иметь произвольную длину)) |
Как то так
<body> <script> const sampleXStr = '2d60a05493265733ff38002c9b80d359ddd9707f98f1c72ce38f08fbb057e6ee'; const xStrtoBinArr = (data) => { data = data.padStart(((data.length/2+0.5)|0)*2, '0') const len = data.length; const arr = []; for (let i=0; i<len; i+=2) { const x = data[i]+data[i+1] arr.push(parseInt(x,16)); } return arr; } const saveBitArray = function (data, filename) { const binar = xStrtoBinArr(data); const buffer = new ArrayBuffer(binar.length); let bindata = new Uint8Array(buffer); for (let i=0; i<binar.length; i++) bindata[i] = binar[i]; const a = document.createElement("a"); a.download = filename; document.body.append(a); a.style = "display: none"; const blob = new Blob([buffer], {type: "octet/stream"}); const url = window.URL.createObjectURL(blob); a.href = url; a.click(); window.URL.revokeObjectURL(url); a.remove(); }; saveBitArray(sampleXStr, 'examplebin'); </script> </body> |
Цитата:
В то же время при поиске в интернете был найден иной способ — что вы можете сказать на счёт него?) /* Альтернативная функция перевода из hex в bin */ function hex2bin(hex){ return (parseInt(hex, 16).toString(2)).padStart(8, '0'); } |
Цитата:
Яснее было бы data = data.padStart(data.length + data.length%2, '0') Цитата:
И только с величиной от 0 до 255. Просто переводит его в строку с записью битов. |
Цитата:
Или тот вариант быстрее? |
voraa,
Хм, не знаю почему, но только сейчас пришла эта мысль — раз у нас большая величина в шестнадцатеричной системе счисления (32 байта хэш против 16 байтов число), то может оптимальнее сразу всё хранить в hex ?) |
voraa,
Получается BigInt -> Hex надо вот так? const number = 340282366920938463463374607431768211455n; const toBinArr = (data) => { data = data.toString(16).padStart(data.length + data.length%2, '0'); // Чувствую, что padStart здесь не нужен? //да и вообще логично, что для hex строк обязательное должно быть условие, чтобы они делились на 2 без остатка const len = data.length; const arr = []; for (let i=0; i<len; i+=2) { const x = data[i]+data[i+1] arr.push(parseInt(x,16)); } return arr; } const saveBitArray = function (data, filename) { const binar = toBinArr(data); const buffer = new ArrayBuffer(binar.length); let bindata = new Uint8Array(buffer); for (let i=0; i<binar.length; i++) bindata[i] = binar[i]; const a = document.createElement("a"); a.download = filename; document.body.append(a); a.style = "display: none"; const blob = new Blob([buffer], {type: "octet/stream"}); const url = window.URL.createObjectURL(blob); a.href = url; a.click(); window.URL.revokeObjectURL(url); a.remove(); }; saveBitArray(number, 'examplebin'); |
Цитата:
Это не в 16-ричную переводит, а в массив байт И где хранить? В ОП или на диске? |
Цитата:
|
Часовой пояс GMT +3, время: 22:48. |