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/ кодирование, чтобы немного смягчить это, или поискать другую библиотеку.
- Как преобразовать строку в массив байтов
- Проблемы с преобразованием byte[] в String
- Преобразование строки в IP-адрес
- Разбор строк приема Arduino
- Почему EEPROM.get() не работает?
- Разобрать mac-строку char* в массив uint8_t
- Назначение и управление цифровым выводом из строки
- Преобразование строки в целое число