Преобразование строки шестнадцатеричных значений 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);
Любая помощь будет оценена по достоинству. Спасибо!
@Amir, 👍1
Обсуждение2 ответа
Есть функции C, которые могут преобразовывать текст в число. Например, strtol() или atoi() . Вот небольшой фрагмент для начала:
char *str = "FF";
char *ptr;
int result = strtol(str, &ptr, 16); // 16 — это основание, в котором находится строка (HEX -> основание 16)
В конце result будет 0xFF или 255. Вы можете использовать это, чтобы достичь того, что вы пытаетесь сделать. Взгляните на эту функцию, которую вы можете использовать для управления своим Строка.
Вы только преобразуете объект 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
- Чтение и запись в EEPROM
- Подстрока: Что вызывает усечение вывода?
- Почему символы со значением выше 127 "дополняются" 1s длиной 16 бит, а символы со значениями 0-127 - нет?
- Возможность очистить код?
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
нет такой вещи, как шестнадцатеричный байт ... это просто 8-битное число ... вы можете использовать 0xff или 255, потому что это одно и то же значение, @jsotola
@jsotola Это всего лишь пример, мне нужно, чтобы это использовалось для всех шестнадцатеричных значений. Как преобразовать строку в массив байтов?, @Amir
Связано: [Как преобразовать шестнадцатеричную строку в массив байтов?](https://arduinoprosto.ru/q/39861/how-to-convert-an-hex-string-to-an-array-of -байты), @Gabriel Staples