У меня все работает, исключая 1 байт! Заголовок PNG имеет 0x0D на 5 -м байте. Когда я использую эту функцию BASE64, она так или иначе лишивает ее. Когда я получаю вложение, я могу просматривать его в системе Linux, но поврежден в Windows. Кто -нибудь знает, почему это происходит и как я могу убедиться, что это не удаляет этот 5 -й байт? < /P>
const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
std::string base64_encode_mime(const char* data, size_t data_len) {
std::string encoded_string;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
// Process data in chunks of 3 bytes
while (data_len--) {
char_array_3[i++] = *(data++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) > 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) > 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; i < 4; i++) {
encoded_string += base64_chars[char_array_4];
}
i = 0;
}
}
// Handle padding
if (i) {
for (j = i; j < 3; j++) {
char_array_3[j] = '\0';
}
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) > 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) > 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; j < i + 1; j++) {
encoded_string += base64_chars[char_array_4[j]];
}
while ((i++ < 3)) {
encoded_string += '=';
}
}
// Add MIME line breaks (e.g., every 76 characters)
std::string final_encoded_string;
for (size_t k = 0; k < encoded_string.length(); ++k) {
final_encoded_string += encoded_string[k];
if ((k + 1) % 76 == 0 && (k + 1) != encoded_string.length()) {
final_encoded_string += "\r\n"; // CRLF for MIME
}
}
return final_encoded_string;
}
< /code>
Для отправки вложения я делаю это в разделе данных: < /p>
Subject: Testmessage
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=sep
--sep
Content-Type: text/plain; charset=UTF-8
Here your text...
this is the text body
--sep
Content--Type: application/octet-stream; name=myimg.png
Content-Disposition: attachment; filename=myimg.png
Content-Transfer-Encoding: base64
[press enter]
iVBORw0KGgoAAAANSUhEUgAAB4AAAAPTCAY...............
[press enter]
--sep--
.
Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-email-a
Выкл от одного байта; Нужна дополнительная CR в кодированной строке MIME Base64 для отправки вложения электронной почты ⇐ C++
Программы на C++. Форум разработчиков
1752370555
Anonymous
У меня все работает, исключая 1 байт! Заголовок PNG имеет 0x0D на 5 -м байте. Когда я использую эту функцию BASE64, она так или иначе лишивает ее. Когда я получаю вложение, я могу просматривать его в системе Linux, но поврежден в Windows. Кто -нибудь знает, почему это происходит и как я могу убедиться, что это не удаляет этот 5 -й байт? < /P>
const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
std::string base64_encode_mime(const char* data, size_t data_len) {
std::string encoded_string;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
// Process data in chunks of 3 bytes
while (data_len--) {
char_array_3[i++] = *(data++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) > 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) > 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; i < 4; i++) {
encoded_string += base64_chars[char_array_4[i]];
}
i = 0;
}
}
// Handle padding
if (i) {
for (j = i; j < 3; j++) {
char_array_3[j] = '\0';
}
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) > 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) > 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; j < i + 1; j++) {
encoded_string += base64_chars[char_array_4[j]];
}
while ((i++ < 3)) {
encoded_string += '=';
}
}
// Add MIME line breaks (e.g., every 76 characters)
std::string final_encoded_string;
for (size_t k = 0; k < encoded_string.length(); ++k) {
final_encoded_string += encoded_string[k];
if ((k + 1) % 76 == 0 && (k + 1) != encoded_string.length()) {
final_encoded_string += "\r\n"; // CRLF for MIME
}
}
return final_encoded_string;
}
< /code>
Для отправки вложения я делаю это в разделе данных: < /p>
Subject: Testmessage
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=sep
--sep
Content-Type: text/plain; charset=UTF-8
Here your text...
this is the text body
--sep
Content--Type: application/octet-stream; name=myimg.png
Content-Disposition: attachment; filename=myimg.png
Content-Transfer-Encoding: base64
[press enter]
iVBORw0KGgoAAAANSUhEUgAAB4AAAAPTCAY...............
[press enter]
--sep--
.
Подробнее здесь: [url]https://stackoverflow.com/questions/79699601/off-by-one-byte-need-extra-cr-in-base64-encoded-mime-string-for-sending-email-a[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия