Что это за бессмысленная строка, которую мы получаем при запросе двоичных данных, и как мы конвертируем ее в правильный буфер?

При использовании библиотеки для запроса некоторых данных, не относящихся к ASCII/UTF8, мы часто возвращаем строку, полную бессмыслицы. Пример:

const got = require("got");
got("http://twemoji.maxcdn.com/16x16/1f525.png")
    .then(response => console.log(response.body))

Это вывод:

�PNG

IHD��aaIDAT8�c`��L�fEb��?��8�-���@���5�!� ���|bQ\�$�� �ׁX�y�xT
���y@<                                                       �c�i��6$�K$
L÷���w��������_��Ϡ���d��?�j��2��� ��hX��cn������e"L����x�3�
             ��Y�f�N���
mt:����2e�f��N���~{'̀x�ȿ �;�m
                             �
    �PIEND�B`�            �vZ�]�dX<R�\�Y:������`�A�A��ӂƟ}�����#A�\�n����|�A� u83����,�{������@�@4��#��D�

Любопытно, что это то же самое, что мы видим при загрузке изображения и использовании:

cat 1f525.png

Что именно это за строка, почему она выглядит так, и как мы можем преобразовать ее в надлежащий объект Buffer?

3 ответа

Не очень странно, что вы видите тот же результат из cat - так выглядит изображение PNG при интерпретации в виде строки.

Согласно got документация, она должна возвращать буфер при указании кодировки как null, возможно console.log преобразует буфер в строку, или вы можете попытаться установить кодировку image/png,

Вы действительно пытались сохранить изображение в файл? Возможно, это просто сработает.

По умолчанию, got принесет вам строку. Предполагается, что вам нужны текстовые данные UTF-8 по умолчанию, поскольку это, вероятно, наиболее распространенный случай, когда люди выбирают HTML-документы. Из документации:

encoding

Тип: строка, null

По умолчанию: 'utf8'

Кодировка для использования на setEncoding данных ответа. Если null тело возвращается как Buffer,

Если вы хотите использовать двоичные данные, укажите {encoding: null}:

const got = require("got");
got("http://twemoji.maxcdn.com/16x16/1f525.png", {encoding:null})
    .then(response => console.log(response.body))

затем response.body будет Buffer,

Это изображение в формате PNG, которое представляет собой не текстовые данные, а просто базовые двоичные данные. Не имеет смысла интерпретировать это как строку.

got вернусь string, buffer, readableStream, или же object, console.log преобразует ваш поток в строку, которая не то, что вы хотите. cat имеет дело с текстом, а не двоичными данными.

Также ответ от http://twemoji.maxcdn.com/16x16/1f525.png не включает Content-Type заголовок, который может быть сбрасывать got библиотека.

Другие вопросы по тегам