Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 15.01.2023, 15:20
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от webgraph
Ну, преобразование-то и так работает же.
Это преобразовывает в строку. Каждый символ '0' или '1'. а нам эти нули и единицы надо преобразовать в биты и распихать их по байтам.
И еще решить, как хранить младший байт первым или старший.
В примере выше, в Uint8Array первым идет старший байт. Но не уверен, что это правильно.

ЗЫ
Посмотрев всякие материалы убедился, что именно так правильно (первыми идут старшие байты). Такой порядок обычно применяется при передаче по сети и межкомпьютерного обмена данными.

Последний раз редактировалось voraa, 15.01.2023 в 15:46.
Ответить с цитированием
  #12 (permalink)  
Старый 15.01.2023, 16:39
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa Посмотреть сообщение
Это преобразовывает в строку. Каждый символ '0' или '1'. а нам эти нули и единицы надо преобразовать в биты и распихать их по байтам.
И еще решить, как хранить младший байт первым или старший.
В примере выше, в Uint8Array первым идет старший байт. Но не уверен, что это правильно.

ЗЫ
Посмотрев всякие материалы убедился, что именно так правильно (первыми идут старшие байты). Такой порядок обычно применяется при передаче по сети и межкомпьютерного обмена данными.
А как это сделать не для числа, а для hex-строки? Например, для 2d60a05493265733ff38002c9b80d359ddd9707f98f1c72ce3 8f08fbb057e6ee (64 байта)

// выведет 00101101011000001010000001010100100100110010011001 01011100110011111111110011100000000000001011001001 10111000000011010011010110011101110111011001011100 00011111111001100011110001110001110010110011100011 10001111000010001111101110110000010101111110011011 101110 (256 бит = 32 байта)


ЗЫ
Понятное дело, что hex-строка может иметь произвольную длину))
Ответить с цитированием
  #13 (permalink)  
Старый 15.01.2023, 17:00
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Как то так
<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>
Ответить с цитированием
  #14 (permalink)  
Старый 15.01.2023, 17:44
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa
data = data.padStart(((data.length/2+0.5)|0)*2, '0')
Несколько в замешательство ввела эта строка кода. Можете подробнее рассказать что в ней происходит?

В то же время при поиске в интернете был найден иной способ — что вы можете сказать на счёт него?)

/* 

Альтернативная функция перевода из hex в bin 

*/
function hex2bin(hex){
    return (parseInt(hex, 16).toString(2)).padStart(8, '0');
}
Ответить с цитированием
  #15 (permalink)  
Старый 15.01.2023, 18:01
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от webgraph
Несколько в замешательство ввела эта строка кода. Можете подробнее рассказать что в ней происходит?
Добавляю '0' в начало строки, если длина нечетна
Яснее было бы
data = data.padStart(data.length + data.length%2, '0')
Сообщение от webgraph
В то же время при поиске в интернете был найден иной способ — что вы можете сказать на счёт него?)
он возвращает строку из '0' и '1',
И только с величиной от 0 до 255.
Просто переводит его в строку с записью битов.
Ответить с цитированием
  #16 (permalink)  
Старый 15.01.2023, 18:25
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa
data = data.padStart(data.length + data.length%2, '0')
Ну вот, это выглядит понятнее и ощущение, что выполняется быстрее (за счет меньшего числа математических действий).

Или тот вариант быстрее?
Ответить с цитированием
  #17 (permalink)  
Старый 15.01.2023, 18:55
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

voraa,

Хм, не знаю почему, но только сейчас пришла эта мысль — раз у нас большая величина в шестнадцатеричной системе счисления (32 байта хэш против 16 байтов число), то может оптимальнее сразу всё хранить в hex ?)
Ответить с цитированием
  #18 (permalink)  
Старый 15.01.2023, 19:23
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

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');

Последний раз редактировалось webgraph, 15.01.2023 в 19:43.
Ответить с цитированием
  #19 (permalink)  
Старый 15.01.2023, 19:40
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Цитата:
const sampleBits = 340282366920938463463374607431768211455n;
 
const toBinArr = (data) => {
    data = data.toString(16).padStart(data.length + data.length%2, '0');
Неужто это работает?
Это не в 16-ричную переводит, а в массив байт
И где хранить? В ОП или на диске?
Ответить с цитированием
  #20 (permalink)  
Старый 15.01.2023, 19:46
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa Посмотреть сообщение
Неужто это работает?
Это не в 16-ричную переводит, а в массив байт
И где хранить? В ОП или на диске?
На диске)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно сохранить загруженный файл? 2chan Node.JS 10 03.04.2016 23:11
Как сохранить данные в файл? Возможно такое на JavaScript? Forgott Общие вопросы Javascript 35 26.06.2015 19:11
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как запустить на выполнение код файла kgn Общие вопросы Javascript 4 06.01.2012 22:08
Как можно достать файл из <input type="file"/> преобразовать файл в base 64 maxcab Events/DOM/Window 2 28.06.2011 22:52