Что это за бессмысленная строка, которую мы получаем при запросе двоичных данных, и как мы конвертируем ее в правильный буфер?
При использовании библиотеки для запроса некоторых данных, не относящихся к 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
библиотека.