|
Как сохранить двоичный код в файл?
Как сохранить число или иную информацию в файл в виде двоичного кода?
//1673357377000 — весит целых 13 байтов console.log((1673357377000 >>> 0).toString(2)); //10011011110111110011110111101000 — весит всего 4 байта //340282366920938463463374607431768211455 — весит целых 39 байт console.log((340282366920938463463374607431768211455n).toString(2)) //11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 — весит всего 16 байт В данном примере 1673357377000 — это дата в секундах от 1 янв 1970. Допустим, надо сохранить много дат в файл — каждая дата с новой строки. Как же это сделать? Попробовали такой код, но нули и единицы всё равно сохраняются как байты:
var sampleBits = (1673357377000 >>> 0).toString(2);
var saveBitArray = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, name) {
var blob = new Blob(data, {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = name;
a.click();
window.URL.revokeObjectURL(url);
};
}());
saveBitArray([sampleBits], 'example');
|
Двоичные данные надо сохранять через типизированные массивы
<body>
<script>
const sampleBits = 1673357377000;
const saveBitArray = function (data, filename) {
const buffer = new ArrayBuffer(8);
const bindata = new Float64Array(buffer);
bindata[0] = data;
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(sampleBits, 'examplebin');
</script>
</body>
|
Цитата:
|
Цитата:
|
Цитата:
В 2 это 00000001 10000101 10011011 11011111 00111101 11101000 В 16 это 01 85 9B DF 3D E8 Ну никак не 4 байта, а 6 Такие числа представляются как double64 В js целые числа меньшие 2**53 - 1 хранятся как денормализованные double64 В windows есть калькулятор. Проверьте в режиме "программист" |
Цитата:
Получается, если хранить в секундах — 1673357377, то это поместится в 4 байта 1100011101111010110100001000001 (31 бит). А как тогда сохранить в файл большое беззнаковое целое число? const bigInt = 340282366920938463463374607431768211455n; console.log(bigInt.toString(2)) |
Цитата:
|
Цитата:
Ну или самим писать функции преобразования их в двоичные и обратно. |
Что то вроде такого
<body>
<script>
const sampleBits = 340282366920938463463374607431768211455n;
const toBinArr = (data) => {
const binstr = data.toString(2);
const len = binstr.length;
const arr = [];
let bb = 0;
let shift = 0;
for (let i=0; i<len; i++) {
const bit = binstr.at(-i-1);
if (bit === '1')
bb |= 1<<shift;
shift ++;
if (i%8 == 7) {
arr.unshift(bb);
bb=0;
shift = 0;
}
}
if (bb) arr.unshift(bb);
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(sampleBits, 'examplebin');
</script>
</body>
|
Цитата:
// Псевдопример const bigInt = 340282366920938463463374607431768211455n; const binaryBigInt = bigInt.toString(2); console.log(binaryBigInt) // выведет 11111111....11111111 (128 единиц, т.е. 128 бит = 16 байт) const arrayBuffer = new ArrayBuffer(16); const binaryData = new Uint128Array(arrayBuffer); // Uint128Array не существует — типа надо эту функцию создать? binaryData[0] = binaryBigInt; |
| Часовой пояс GMT +3, время: 04:00. |
|