Строка в массив динамических байтов

Я новичок в Arduino, застрял в String в динамическом массиве байтов.

Моя строка:

String Finalval="6D616320747820636E662031352033300D0A";

Динамический массив байтов:

byte ft[]={0x6D,0x61,0x63,0x20,0x74,0x78,0x20,0x63,0x6E,0x66,0x20,0x31,0x35,0x20,0x33,0x30,0x0D,0x0A};

, 👍1


1 ответ


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

0

Общие функции преобразования C-строки в массив байтов, как показано в https:// stackoverflow.com/questions/3408706/hexadecimal-string-to-byte-array-in-c работают отлично.

Source hex string: 6D616320747820636E662031352033300D0A
Conversion OK buff 0x289 len 18
output byte array:
  00 6d 61 63 20 74 78 20 63 6e 66 20 31 35 20 33 30  mac tx cnf 15 30
  10 0d 0a                                            ..
#include <Arduino.h>

void hexDump (const char *desc, const void *addr, const int len);

bool convert_hexstr_to_bytearray(const char* source, uint8_t* &output,
        size_t& output_len) {
    size_t len = strlen(source);
    // не может преобразовать нечетную длину строки
    if ((len % 2) != 0) {
        return false;
    }
    //динамически выделяем выходной буфер
    output_len = len / 2;
    output = (uint8_t*) malloc(output_len);
    const char* curPos = source;
    for (size_t count = 0; count < len; count++) {
        sscanf(curPos, "%2hhx", output + count);
        curPos += 2;
    }
    return true;
}

String Finalval="6D616320747820636E662031352033300D0A";

void setup() {
    Serial.begin(115200);
    Serial.print("Source hex string: ");
    Serial.println(Finalval);
    Serial.flush();

    uint8_t* buffer = nullptr;
    size_t buffer_len = 0;
    if(convert_hexstr_to_bytearray(Finalval.c_str(), buffer, buffer_len)) {
        Serial.println("Conversion OK buff 0x" + String((long)buffer,HEX) + " len " + String(buffer_len));
        hexDump("output byte array", buffer, buffer_len);
    } else {
        Serial.println("Conversion failed\n");
    }

    //свободная память
    if(buffer)
        free(buffer);
}

void loop() {
}

void PrintHex8(const uint8_t *data, uint8_t length) // печатает 8-битные данные в шестнадцатеричном формате
{
     char tmp[length*2+1];
     byte first;
     byte second;
     for (int i=0; i<length; i++) {
           first = (data[i] >> 4) & 0x0f;
           second = data[i] & 0x0f;
           // база для преобразования однозначных чисел в ASCII равна 48
           // база для 10-16, чтобы стать символами нижнего регистра af равна 87
           // примечание: разница 39
           tmp[i*2] = first+48;
           tmp[i*2+1] = second+48;
           if (first > 9) tmp[i*2] += 39;
           if (second > 9) tmp[i*2+1] += 39;
     }
     tmp[length*2] = 0;
     Serial.print(tmp);
}

void hexDump (const char *desc, const void *addr, const int len) {
    int i;
    unsigned char buff[17];
    const unsigned char *pc = (const unsigned char*)addr;

    // Описание вывода, если оно задано.
    if (desc != NULL) {
        Serial.print (desc);
        Serial.println(":");
    }

    if (len == 0) {
        Serial.print("  ZERO LENGTH\n");
        return;
    }
    if (len < 0) {
        Serial.println("  NEGATIVE LENGTH: " + String(len));
        return;
    }

    // Обрабатываем каждый байт данных.
    for (i = 0; i < len; i++) {
        // Число, кратное 16, означает новую строку (со смещением строки).

        if ((i % 16) == 0) {
            // Просто не печатайте ASCII для нулевой строки.
            if (i != 0) {
                Serial.print ("  ");
                Serial.println((char*)buff);
            }

            // Вывод смещения.
            Serial.print ("  ");
            PrintHex8((uint8_t*)&i, 1);
        }

        // Теперь шестнадцатеричный код для конкретного символа.
        Serial.print(" ");
        PrintHex8(pc + i,1);


        // И сохранить печатный символ ASCII на потом.
        if ((pc[i] < 0x20) || (pc[i] > 0x7e))
            buff[i % 16] = '.';
        else
            buff[i % 16] = pc[i];
        buff[(i % 16) + 1] = '\0';
    }

    // Дополнить последнюю строку, если не ровно 16 символов.
    while ((i % 16) != 0) {
        Serial.print ("   ");
        i++;
    }

    // И вывести последний бит ASCII.
    Serial.print ("  ");
    Serial.println((char*)buff);
}

,

Я пытаюсь это сделать, но не работаю Serial.write(buffer,sizeof(buffer)), @Vikash Singh

@VikashSingh, нигде в опубликованном коде нет утверждения: Serial.write(buffer,sizeof(buffer))., @user3629249

@VikashSingh звучит так, будто у вас серьезная проблема при обработке декодированного буфера. Какой точный код?, @Maximilian Gerhardt

@MaximilianGerhardt спасибо за помощь, моя проблема решена, @Vikash Singh