Telegram Group & Telegram Channel
#dev #web

Небольшая заметка, чтобы разгрузить беклог.

Как засунуть в HTML бинарные данные и извлечь их в JSе? Казалось бы, ответ простой — применить base64 и декодировать в рантайме. А если хочется еще и файл сделать маленьким? Вот такой код загружает данные в переменную s:

<script>(async()=>s=(await (await fetch("#")).bytes()).slice(80))()</script><!--Binary data goes here...


Решение простое, и заметки б не было, если б я до этого не перепробовала несколько способов, потому что забыла про существование fetch.

Самый интересный из них — UTF-16. Дело в том, что случайные бинарные данные намного вероятнее являются валидным UTF-16, чем валидным UTF-8, т.е. можно эскейпить сильно меньше символов и хранить бинарные данные практически бесплатно.

Подход, соответственно, следующий. Интерпретируем данные, которые нужно закодировать, как последовательность 16-битных чисел. Кодпоинты, задающие безопасные UTF-16 символы, т.е. все кроме суррогатов и кавычек/бэкслешей, прям так и выдаем на выход. А чтобы закодировать опасное число c, прибавляем к нему 0x10000 и выдаем на выход такой кодпоинт, закодированный в UTF-16. Для декодирования просто нужно пройтись по кодпоинтам строки, сделать & 0xffff, и реинтерпретнуть получившийся массив 16-битных чисел как массив байт.

Теряем мы здесь по одному слову на каждое слово в промежутке [0xd800; 0xe000) и еще по мелочи от эскейпов, т.е. размер файла от такого кодирования увеличивается всего где-то на 3%.

Дальше встает загадка о том, что на дворе 2024 год, все используют UTF-8, и браузеры дефолтнутся на него. Но! Стандарт по какой-то причине говорит, что если HTML-файл начинается с BOM, то кодировку надо определять по нему. Даже если в Content-type указана иная. Так что таким трюком можно заставить использовать UTF-16 даже Github Pages.

Остался нюанс, что это форсит UTF-16 на весь HTML-файл, увеличивая размер всего кроме бинарных данных. Так что где-то тут еще может быть разумно засунуть HTML прямо в бинарные данные и подгружать его в рантайме JSом.



group-telegram.com/alisa_rummages/185
Create:
Last Update:

#dev #web

Небольшая заметка, чтобы разгрузить беклог.

Как засунуть в HTML бинарные данные и извлечь их в JSе? Казалось бы, ответ простой — применить base64 и декодировать в рантайме. А если хочется еще и файл сделать маленьким? Вот такой код загружает данные в переменную s:

<script>(async()=>s=(await (await fetch("#")).bytes()).slice(80))()</script><!--Binary data goes here...


Решение простое, и заметки б не было, если б я до этого не перепробовала несколько способов, потому что забыла про существование fetch.

Самый интересный из них — UTF-16. Дело в том, что случайные бинарные данные намного вероятнее являются валидным UTF-16, чем валидным UTF-8, т.е. можно эскейпить сильно меньше символов и хранить бинарные данные практически бесплатно.

Подход, соответственно, следующий. Интерпретируем данные, которые нужно закодировать, как последовательность 16-битных чисел. Кодпоинты, задающие безопасные UTF-16 символы, т.е. все кроме суррогатов и кавычек/бэкслешей, прям так и выдаем на выход. А чтобы закодировать опасное число c, прибавляем к нему 0x10000 и выдаем на выход такой кодпоинт, закодированный в UTF-16. Для декодирования просто нужно пройтись по кодпоинтам строки, сделать & 0xffff, и реинтерпретнуть получившийся массив 16-битных чисел как массив байт.

Теряем мы здесь по одному слову на каждое слово в промежутке [0xd800; 0xe000) и еще по мелочи от эскейпов, т.е. размер файла от такого кодирования увеличивается всего где-то на 3%.

Дальше встает загадка о том, что на дворе 2024 год, все используют UTF-8, и браузеры дефолтнутся на него. Но! Стандарт по какой-то причине говорит, что если HTML-файл начинается с BOM, то кодировку надо определять по нему. Даже если в Content-type указана иная. Так что таким трюком можно заставить использовать UTF-16 даже Github Pages.

Остался нюанс, что это форсит UTF-16 на весь HTML-файл, увеличивая размер всего кроме бинарных данных. Так что где-то тут еще может быть разумно засунуть HTML прямо в бинарные данные и подгружать его в рантайме JSом.

BY Алиса копается


Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260

Share with your friend now:
group-telegram.com/alisa_rummages/185

View MORE
Open in Telegram


Telegram | DID YOU KNOW?

Date: |

For example, WhatsApp restricted the number of times a user could forward something, and developed automated systems that detect and flag objectionable content. Since January 2022, the SC has received a total of 47 complaints and enquiries on illegal investment schemes promoted through Telegram. These fraudulent schemes offer non-existent investment opportunities, promising very attractive and risk-free returns within a short span of time. They commonly offer unrealistic returns of as high as 1,000% within 24 hours or even within a few hours. The regulator said it has been undertaking several campaigns to educate the investors to be vigilant while taking investment decisions based on stock tips. In addition, Telegram's architecture limits the ability to slow the spread of false information: the lack of a central public feed, and the fact that comments are easily disabled in channels, reduce the space for public pushback. Such instructions could actually endanger people — citizens receive air strike warnings via smartphone alerts.
from us


Telegram Алиса копается
FROM American