Преобразование строки шестнадцатеричных значений 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