Как кодировать данные двоичного файла в ISO-8859-1, чтобы прикрепить их к телу почтового сообщения HTTP

Я пытаюсь преобразовать полную строку байтов из файла, открытого в двоичном режиме, в строку, закодированную в наборе символов ISO-8859-1. Насколько я понимаю, при преобразовании в ISO-8859-1 вся двоичная информация из файла сохраняется, поэтому она преобразуется в этот формат. Это верное утверждение?

Я работаю на С++ (Visual Studio 2017), создавая исполняемый файл для использования на платформе Windows. У меня нет опыта в программировании HTTP.

У меня есть код прототипа, написанный в коде PowerShell, который успешно выполняет функции, которые я пытаюсь воспроизвести на C++. В коде Power Shell отправляется HTTP-сообщение для загрузки файла прошивки на устройство.

  • Сообщение включает заголовки и тело:
  • Сообщение использует протокол multipart/form-data.

Пример заголовков сообщения:

Authorization: Bearer Yosda0IDRQuVaU_L0SnV5g==                                                                                                              
Content-Type: multipart/form-data; boundary=42b745c8-4da8-454e-8c13-cbb5c1f7694f                                                                           
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  

Пример тела сообщения:

--1a2fc07a-d882-4470-a1da-79716d34cd9b
Content-Disposition: form-data; name="upgrade_file"; filename=""
Content-Type: application/octet-stream

// File data (encoded in ISO-8859-1 format) goes here //
--1a2fc07a-d882-4470-a1da-79716d34cd9b
Content-Disposition: form-data; name="submit"

Install OS
--1a2fc07a-d882-4470-a1da-79716d34cd9b--

Сценарий PowerShell преобразует файл с помощью следующих строк кода:

$bytes = [System.IO.File]::ReadAllBytes($file.FullName);
if ( $bytes )
{
  $enc = [System.Text.Encoding]::GetEncoding(iso-8859-1);
  $data = $enc.GetString($bytes);
}

После настройки заголовков и тела сообщение отправляется, и прошивка загружается при запуске кода PowerShell.

В моем коде C++ у меня есть заголовки, а также коды перед телом и после тела. Я думаю (не уверен), что мне просто нужно преобразовать файл в iso-8859-1, чтобы сообщение заработало сейчас.

Я использую libcurl для отправки сообщения.

res = curl_easy_perform(pCurl);

В настоящее время (без преобразования файла в iso-8859-1) я получаю следующее сообщение об ошибке при вызове функции:

Сбой при получении данных от пира

Когда сообщение отправлено, я вижу, что загружаются только некоторые байты. Я предполагаю, что это может быть связано с тем, что данные файла не закодированы должным образом, и когда он читает эти данные, он достигает некоторой точки, когда данные находятся в формате, который он не может обработать.


person Veronian    schedule 27.03.2019    source источник
comment
Вы не должны кодировать данные двоичного файла ВООБЩЕ, вы должны отправлять его необработанные байты КАК ЕСТЬ, что и делает application/octet-stream. При использовании libcurl следует использовать curl_mime_init(), curl_mime_addpart(), curl_mime_filedata() и т. д., чтобы подготовить запрос multipart/form-data, а затем отправить его с помощью CURLOPT_MIMEPOST...   -  person Remy Lebeau    schedule 27.03.2019
comment
... даже более старый CURLOPT_HTTPPOST может опубликовать двоичный файл в формате multipart/form-data через curl_formadd(CURLFORM_FILE).   -  person Remy Lebeau    schedule 27.03.2019
comment
@RemyLebeau Я подумал, что было бы немного странно переходить с двоичного на ISO-8859-1, но, как я уже сказал, я не опытный программист HTTP. Я просто следовал сценарию PowerShell, который мне дали, и это то, что он делал. Прежде чем увидеть ваш ответ, я перешел на использование функций пантомимы, и это почти сработало. Я только что разместил еще один вопрос на этом форуме, на который, возможно, вы могли бы дать ответ. Загрузка начинается нормально, но не завершает весь файл. В очередной раз благодарим за помощь.   -  person Veronian    schedule 29.03.2019
comment
Я отправил ответ на ваш другой вопрос.   -  person Remy Lebeau    schedule 29.03.2019