Arduino String: использовать массив символов, не заканчивающийся нулем?

Я использую библиотеку, которая принимает Строку в качестве параметра (https://github.com/gmag11/painlessMesh)

Я хочу передать массивы символов, которые являются двоичными (UTF-8) данными, которые также содержат нулевые байты (0x00). Прямо сейчас результирующая строка обрезается на первом нулевом байте, как и ожидалось. Я знаю полную длину массива символов, возможно ли создать строку Arduino, передавая произвольную длину, так, чтобы полная строка также содержала нулевые байты, включая данные, которые следуют после, вплоть до заданной длины?

У меня уже была эта проблема, и я решил ее, преобразовав данные UTF-8 в шестнадцатеричные, а затем добавив нулевой байт. Я надеялся, что есть более элегантный способ, так как это заставляет меня удваивать размер данных.

Спасибо!

, 👍2


1 ответ


Лучший ответ:

3

Предполагая, что вы говорите о функции

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/ кодирование, чтобы немного смягчить это, или поискать другую библиотеку.

,