Arduino String: используйте массив символов с нулевым завершением?
Я использую библиотеку, которая принимает String
как ее параметр ( https://github.com/gmag11/painlessMesh )
Я хочу передать массивы символов, которые являются двоичными (UTF-8) данными, которые также содержат нуль-байты (0x00
). Прямо сейчас результирующая строка обрезается в первом нуль-байте, как и ожидалось. Я знаю всю длину массива char, возможно ли построить Arduino String при передаче произвольной длины, так что полная String также содержит нулевые байты, включая следующие данные, вплоть до заданной длины?
У меня была эта проблема раньше, а затем я решил ее преобразовать данные UTF-8 в шестнадцатеричный, а затем добавить нулевой байт. Я надеялся, что есть более элегантный способ, поскольку это заставляет меня удвоить размер данных.
Спасибо!
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/, хотя для смягчения этого немного, или найдите другую библиотеку.