Arduino String: используйте массив символов с нулевым завершением?

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

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

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

Спасибо!

2 голоса | спросил user125756 10 Maypm18 2018, 15:47:14

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

ответил Maximilian Gerhardt 10 Maypm18 2018, 16:01:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132