Arduino String: использовать массив символов, не заканчивающийся нулем?
Я использую библиотеку, которая принимает Строку в качестве параметра (https://github.com/gmag11/painlessMesh)
Я хочу передать массивы символов, которые являются двоичными (UTF-8) данными, которые также содержат нулевые байты (0x00). Прямо сейчас результирующая строка обрезается на первом нулевом байте, как и ожидалось. Я знаю полную длину массива символов, возможно ли создать строку Arduino, передавая произвольную длину, так, чтобы полная строка также содержала нулевые байты, включая данные, которые следуют после, вплоть до заданной длины?
У меня уже была эта проблема, и я решил ее, преобразовав данные UTF-8 в шестнадцатеричные, а затем добавив нулевой байт. Я надеялся, что есть более элегантный способ, так как это заставляет меня удваивать размер данных.
Спасибо!
@user125756, 👍2
Обсуждение1 ответ
Лучший ответ:
Предполагая, что вы говорите о функции
bool painlessMesh::sendBroadcast( String &msg, bool includeSelf = false)
Затем вы увидите, что в конечном итоге библиотека передает msg в функцию buildMeshPackage, где она создает сообщение JSON (см. здесь)
String ICACHE_FLASH_ATTR painlessMesh::buildMeshPackage(uint32_t destId, uint32_t fromId, meshPackageType type, String &msg) {
debugMsg(GENERAL, "In buildMeshPackage(): msg=%s\n", msg.c_str());
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["dest"] = destId;
//root["from"] = _nodeId;
root["from"] = fromId;
root["type"] = (uint8_t)type;
switch (type) {
case NODE_SYNC_REQUEST:
case NODE_SYNC_REPLY:
{
JsonArray& subs = jsonBuffer.parseArray(msg);
if (!subs.success()) {
debugMsg(GENERAL, "buildMeshPackage(): subs = jsonBuffer.parseArray( msg ) failed!");
}
root["subs"] = subs;
break;
}
case TIME_SYNC:
root["msg"] = jsonBuffer.parseObject(msg);
break;
default:
root["msg"] = msg;
}
String ret;
root.printTo(ret);
return ret;
}
Даже если вы создали String с нулевыми терминаторами в нем, в тот момент, когда он помещается в строку JSON, он уничтожает все. JSON по умолчанию не поддерживает двоичные строки данных (ссылка).
Итак, библиотека является проблемой, поскольку она с радостью передает данные как сообщения JSON, и это плохо, если вы хотите передавать двоичные данные. Вы можете использовать Base64 или более эффективное http://base91.sourceforge.net/ кодирование, чтобы немного смягчить это, или поискать другую библиотеку.
Ого! Спасибо за быстрый ответ. Ладно, тогда, пожалуй, придётся согласиться на небинарный... Спасибо!, @user125756
Ключевая часть этого ответа — кодирование ваших «двоичных» данных. Это практикуется уже давно, и электронные письма *до сих пор* часто содержат «текст » в кодировке Base64 для вложений двоичных файлов. Если фреймворк принимает строки, то вам *необходимо* преобразовать ваши двоичные данные в нечто, похожее на строку., @jose can u c
Я бы проголосовал за ваш ответ, если бы мог :) (низкая репутация на данный момент этому препятствует), @user125756
- Как преобразовать строку в массив байтов
- Проблемы с преобразованием byte[] в String
- Преобразование строки в IP-адрес
- Разбор строк приема Arduino
- Почему EEPROM.get() не работает?
- Разобрать mac-строку char* в массив uint8_t
- Назначение и управление цифровым выводом из строки
- Преобразование строки в целое число
Строка не может содержать нулевые символы, так почему же вам нужно передавать данные, которые не являются строкой? Может быть, потому, что вам нужно отправить сообщение, которое не является строкой?, @jose can u c
Единственный нулевой байт, который выдаёт кодировка UTF-8, — это символ NULL. Если нулевой байт находится где угодно, но не в конце, то это не UTF-8., @gre_gor
@josecanuc Я не хочу использовать строку, просто библиотека просит меня передать ее., @user125756