Преобразование строки шестнадцатеричных значений Arduino с разделителями-запятыми в массив байтов

Прошу прощения, если это наивный вопрос. Как преобразовать String с шестнадцатеричными значениями в массив байтов с этими шестнадцатеричными значениями?

Это:

String s = "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff";

Необходимо преобразовать в это:

char test[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };

Я использовал следующую процедуру. Однако он преобразует его, но каждый символ сохраняется как символ, а не как шестнадцатеричное значение:

unsigned int str_len = s.length() + 1;
char charArray[str_len];
s.toCharArray(charArray, str_len);

Любая помощь будет оценена по достоинству. Спасибо!

, 👍1

Обсуждение

нет такой вещи, как шестнадцатеричный байт ... это просто 8-битное число ... вы можете использовать 0xff или 255, потому что это одно и то же значение, @jsotola

@jsotola Это всего лишь пример, мне нужно, чтобы это использовалось для всех шестнадцатеричных значений. Как преобразовать строку в массив байтов?, @Amir

Связано: [Как преобразовать шестнадцатеричную строку в массив байтов?](https://arduinoprosto.ru/q/39861/how-to-convert-an-hex-string-to-an-array-of -байты), @Gabriel Staples


2 ответа


2

Есть функции C, которые могут преобразовывать текст в число. Например, strtol() или atoi() . Вот небольшой фрагмент для начала:

char *str = "FF";
char *ptr;
int result = strtol(str, &ptr, 16); // 16 — это основание, в котором находится строка (HEX -> основание 16)

В конце

result будет 0xFF или 255. Вы можете использовать это, чтобы достичь того, что вы пытаетесь сделать. Взгляните на эту функцию, которую вы можете использовать для управления своим Строка.

,

3

Вы только преобразуете объект String в массив символов. Необходимо дополнительно разбить массив символов на подстроку, а затем преобразовать его в число.

Чтобы разделить массив символов, вы можете использовать функцию strtok() в C++.

Не существует функции преобразования str, которая может напрямую преобразовывать "0xff" в uint8_t. Однако, как упомянул @rubemnobre, strtol() можно использовать для преобразования строки ac в long (в Arduino это 4-байтовое число) и далее преобразуется в uint8_t и сохраняется в массиве байтов.

String s = "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff";

// Преобразование объекта String в массив символов
unsigned int str_len = s.length()+1;
char charArray[str_len];
s.toCharArray(charArray, str_len);

uint8_t byteArray[7];
int i=0;

// разделить charArray на каждый ',' и преобразовать в uint8_t
char *p = strtok(charArray, ",");
while(p != NULL) {
  byteArray[i++] = strtoul(p, NULL, 16);
  p = strtok(NULL, ",");
}

// Печать массива байтов
for (i=0; i<sizeof(byteArray)/sizeof(char); i++) {
  Serial.print(byteArray[i]);
  Serial.println(", ");
}
Serial.println();
,

Если вы не используете strtol с "endptr" (&ptr в вашем случае), вы можете просто заменить его на NULL, и параметр будет проигнорирован. Кроме того, если вы используете uint8_t, тогда strtoul будет лучшим выбором., @Majenko

@Majenko, спасибо и проголосовал за ваш комментарий, сделайте код чище и проще. Я обновил свой ответ., @hcheung