Преобразование типов String HEX в INT
- Войдите на сайт для отправки комментариев
Вс, 17/01/2016 - 10:47
Всем привет!
Стоит такая задача... Имеется строка типа String, которая содержит в себе шестнадцатиричное число.
String str="C2"; или String str="0xC2";
Как теперь можно преобразовать это значение в тип INT или BYTE, есть какое нибудь простое решение? Конвертации вида: str.toInt(); и тому подобные, ни к чему не приводят. Как правило появляется ошибка о несовместимости типов, либо результатом является НОЛЬ. Т.к. буквы не конвертируются напрямую в числа. )))
int i = atoi("0xC2");
int i = atoi("0xC2");
Спасибо Andy! :) Только конструкция вида:
не работает.. :( В качестве аргумента функция atoi понимает только тип char. Как перевести тогда String в char?
int
i = atoi(str.c_str());
int
i = atoi(str.c_str());
Эммм... так получаются нули в результате. :(
str.c_str() конвертирует вроде без ошибок, на выходе 0xC2. Не работает само преобразование в int, на выходе всегда ноль.
Попробовал вывести в порт значение переменной i, на выходе получил ноль. Почему-то сама функция не работает. :(
попробуй так
Блин, вчера число на биты раздирали в массив. В школе задание дали, чтоли?
>Andy
Прогресс есть, теперь выводит единицу вместо нуля. ))))
>Евгений
Нет, в школе давно уже не учусь... :) Мне нужно строку формата (dd:c2:be:ef:fe:ed) записать в память мк. Т.е. проверить каждый из шести разрядов адреса на соответствие диапазону значений 00-FF, потом преобразовать это значение в байт и сохранить. Проблема стоит с преобразованием в десятичное число. С обратным преобразованием проблем нет никаких, делается так:
В ячейке памяти хранится один из разрядов в десятичном виде (тип byte). При выводе ф-я String преобразуеи значение в 16-ричный формат, все работает. Обратно сделать не получается... моск плачет уже. )))
dbf-334, а попробуйте использовать EEPROM.get и EEPROM.put с их помощью можно записывать и int и char во встроенной библиотеке eeprom
dbf-334, а попробуйте использовать EEPROM.get и EEPROM.put с их помощью можно записывать и int и char во встроенной библиотеке eeprom
Дело в том, что прежде чем записать значение в ячейку памяти, его сначала нужно проверить. Т.е. если пользователь указал значение "0xGR", а оно ну ни как не укладывается в диапазон 00-FF, оно вообще ошибочно. В память я могу его тупо записать, даже без ошибок и оно будет там спокойно лежать. Только это получится смысловая ошибка, что не допустимо! Указанные вами ф-ции работают напрямую с памятью, минуя всякие проверки. С их помощью можно вообще все что угодно записать и считать, даже структуры данных определенные самим разработчиком, только это все не то... :(
Мне нужно преобразовать 16-ричное число в байт. Проверить, что это число байта лежит в диапазоне 0-255 и записать этот готовый байт уже в ячейку памяти. Тупо не могу просто преобразовать HEX->DEC.
С обратным преобразованием проблем нет никаких, делается так:
Понятно, Вы извращенец, которому некуда девать память :)))) Ну, если так, тогда прямая задача тоже тривиально решается. Почти как писал Andy, только чуток он ошибся. Вот работающий скетч, можете прямо отсюда скопировать и запустить - всё работет:
Кстати, только не понял, а нафмга Вы в первом посте писали, что надо чтобы число с 0х начиналось, а теперб пишете, что формат: (dd:c2:be:ef:fe:ed)?
https://github.com/benrugg/Arduino-Hex-Decimal-Conversion/blob/master/hex_dec.ino
Кстати, только не понял, а нафмга Вы в первом посте писали, что надо чтобы число с 0х начиналось, а теперб пишете, что формат: (dd:c2:be:ef:fe:ed)?
похоже на мас адрес сетевой карты:)
Я в итоге так решил проблему, может понадобится кому:
Чем-то похоже на решение Евгения, только ф-я другая. ;) Кстати, если в начале числа не ставить префикс "0x", то ф-я возвращает ноль, т.е. перестает работать. Обязательно нужен префикс, как идентификатор 16-ричного числа.
похоже на мас адрес сетевой карты:)
И что? Это повод сначала присобачивать к нему 0х а птом геройски с ним бороться? :)
Я в итоге так решил проблему, может понадобится кому:
Не, ну точно " Вы извращенец, которому некуда девать память" :))))
похоже на мас адрес сетевой карты:)
И что? Это повод сначала присобачивать к нему 0х а птом геройски с ним бороться? :)
ну не я же присобачил :)
Понятно, Вы извращенец, которому некуда девать память :))))
Совсем только немного... зато так интереснее. ))))))
Всем спасибо! :)
И все таки не понял... как преобразовать строку, например, "1B" в десятичное целое число 27?
И все таки не понял... как преобразовать строку, например, "1B" в десятичное целое число 27?
Есть over9000 способов. Перечитайте тему, там же готовые куски кода.
И все таки не понял... как преобразовать строку, например, "1B" в десятичное целое число 27?
Самое главное - понять, что компьютер НЕ РАБОТАЕТ с десятичными числами. Сразу после осознания этого факта будет понятно и остальное.
Короче, было два затыка: 1.Надо было преобразовать Строку в массив; 2. Поставить +1 в MyStr.length()+1 .
Преобразуем 1D в десятичное число 29.
sav liana,
молодец, что разобрались, но не останавливайтесь. То, как Вы сделали - самоубийственно по памяти. Вы использовали сразу два убийцы памяти - класс String и sscanf. Обе эти возможности откушивают "мам не горюй". Т.е. String и sscanf - просто огромные пушки для такой воробьиной задачи.
Задачу можно решить намного более дешёвыми средствами. Покопайтесь в сторону того, что
1. Если из любого из символов символа '0' - '9' вычесть символ '0', то получится соответсвующее число. Например,
2. Точно также, если из любого из символов символа 'A' - 'F' вычесть ('A' - 10), то получится соответсвующее число. Например:
Теперь остаётся только организовать поразрядный цикл.
Ппоробуйте сделать такое преобразование без String и без sscanf, поковыряйтесь, если совсем не получится, я Вам помогу.
Ну, я бы упростил. Сейчас я на работе и под рукой нет ардуины. Могу написать на простом С с printf, если Вам всё равно, а если не всё равно, то завтра на ардуине сделаю. Как?
Конечно, важно!!! (и думаю, для многих...)
Здравствуйте!
Немного апну тему.Задача примерно того же плана.
С порта принимаю любое число, не более 6ти разрядов, к примеру 123456. Далее мне нужно:
1)разместить цифры разрядов в следующем порядке 34 56 12,
2) превратить эти пары в 0х34 0х56 0х12 ,
3) сделать инверсию каждой hex пары и отправить на печать в монитор порта
4) отправить то же самое в EEPROM
с 1,3 и 4(процесс отправки) пунктами проблем нет, а вот с пунктом 2 и 4(формат данных) пока ничего не получается
Вариант unsigned char var= (((char chislo[3] -'0') <<4)+char chislo[4] -'0'))
Serial.print(var, HEX) - выдает в порт все что угодно, только не 0х34.
Подтолкните плиз, в нужную сторону. Такое чуйство, что где то что-то по выводу в порт мне все карты перемешивает
Не понял, что "123456" - это три двузначных 16-ричных числа и Вам надо их разделить? А приходят они как строка? Ну так выдерните их sscanf'ом и не забивайте себе мозг.
нет, это любые десятичные с плюсом до 6ти знаков, от 0 до 999999 т.е. уже long , с вводом из монитора порта
- разбил на разряды, значения разрядов спаровал символами в порядке указанном выше, теперь нужно эти пары из string превратить в hex потом сделать инверсию и отправить в монитор порта, а так же записать в eeprom
Не понял Вы ше Вы писали, что они уже шестнадцатиричные их не надо пересчитывать.
Впрочем. дело Ваше, по любому выдергивайте sscanf'ом и не парьтесь. Добавляйте в начало нули и спокойно по две цифры выдёргивайте.
Здравствуйте!
Немного апну тему.Задача примерно того же плана.
С порта принимаю любое число, не более 6ти разрядов, к примеру 123456. Далее мне нужно:
1)разместить цифры разрядов в следующем порядке 34 56 12,
2) превратить эти пары в 0х34 0х56 0х12 ,
3) сделать инверсию каждой hex пары и отправить на печать в монитор порта
4) отправить то же самое в EEPROM
с 1,3 и 4(процесс отправки) пунктами проблем нет, а вот с пунктом 2 и 4(формат данных) пока ничего не получается
Вариант unsigned char var= (((char chislo[3] -'0') <<4)+char chislo[4] -'0'))
Serial.print(var, HEX) - выдает в порт все что угодно, только не 0х34.
Подтолкните плиз, в нужную сторону. Такое чуйство, что где то что-то по выводу в порт мне все карты перемешивает
Поправьте индексы 3 и 4 на 2 и 3 соответственно - в С интексация массивов с 0.
Здравствуйте. Искал похожие темы, но не нашел, поэтому обратился сюда.
Есть LCD дисплей. Понадобилось выводить целые числа типа byte по нажатию кнопки, выбирая их из массива. Но столкнулся с проблемой, вначале 1, 10, 50, 100 выводит корректно, но после вывода 100 на дисплее остаются знакоместа(лишние нули). То есть кликая далее вместо 1 выводится 100, 10 - 100, 50 - 500.
Разбирался здесь http://mypractic.ru/urok-30-tekstovye-stroki-v-arduino-konvertirovanie-dannyx-v-stroki-i-naoborot-klass-string.html#4
Но не помогло преобразование данных в строку, может не там искал
Да что ж вы в дебри сразу... напечатайте еще один пробел лишний после числа и всё.
Знаете, где то похожее видел
Это если не ошибаюсь?
Знаете, где то похожее видел
Это если не ошибаюсь?
А подумать? Какое число короче - 2 или 22?
Да вы правы, спасибо. Вопрос закрыт