И снова перевести String в int
- Войдите на сайт для отправки комментариев
Сб, 01/08/2015 - 22:01
Народ, нужна помощь. PHP избаловал с отсутствием необходимости переводить типы данных из одного в другое.
Есть код, который получает некий код 0x12181110 из строки:
String readString; if (readString.substring(0, 3)=="GET") { for (int i = 8; i < 18; i++){ Serial.print(readString[i]); } }
Его надо послать как ИК сигнал. Соответственно, его надо в int загнать. Делаю:
int rcvcode; Serial.println(readString.substring(8, 18)); rcvcode=readString.substring(8, 18).toInt(); irsend.send(NEC, rcvcode, 32);
Он мне соотв. в 0 конвертирует весь мой код. Как можно сконвертировать как есть в int или во что-нибудь еще, что можно спокойно отослать в ИК передатчик?
Пробовал через char перегнать, но не догнал в итоге. Думаю, что-то типа этого сделать:
char testChar1[] = {'5', '0'}; testVal1 = atol(testChar1);
Но как в char все это загнать посимвольно?
Обычно в таких случаях еще пишут "обыскал весь Интернет".
Почитайте про string.toInt() и string.toCharArray(buf, len)
Спасибо, string.toCharArray помогло.
а как теперь число можно перегнать в вид 0x12345678 из 12345678? или как его в HEX передать как есть?
Вот что вычитал:
Для функций strtol и strtoul можно указать основание системы счисления. При этом, если в качестве основания передан 0, то основание определяется автоматически по первым символам числа. Если это символ '0', а сразу за ним идет цифра - то основание принимается равным 8. Если первая цифра '0', а за ней идет символ 'x' или 'X', то основание принимается равным 16. В остальных случаях основание принимается равным 10. В качестве цифр в этом случае можно использовать символы '0' - '9' и 'A' - 'Z' или 'a' - 'z', а основание может принимать значения от 2 до 36.
В testChar1 у меня 0x12181110
rcvcode выводит: 303567120
Конвертнул - это и есть аналог числа 0x12181110. Теперь его надо конвертнуть обратно в нативный hex. Только как его конвертнуть и именно в "правильный" hex, с 0x спереди?
Можно попробовать: sprintf(buffer,"0x%lX", rcvcode);
Очевидно после этого вопроса возникнет еще сотня другая.
Artemiy, зачем такие сложности?
Зачем какие-то чар-эррэи - Вам некда девать память и быстродействие?
Для десятичных чисел подойдёт самая простая и эффективная функция atoi. Для шетснадцатеричных, пользуйте strtol (хоть там с 0x, хоть без). Чего мудрить-то?
ЕвгенийП, я так делал, но мне вместо 0x12345678 возвращается его 16-ричная производная. 305419896
Вот код:
Выводит в сериал:
Не понял, так 305419896 это и есть 0x12345678. Т.е. Вы нормально преобразовали строку в число. А чего нужно-то? Вы хотите. чтобы Serial Вам в шестнадцатиричном печатал? Так скажите ему (второй параметр print - система счисления).
Да, преобразовал нормально. Смутило то, что для команды irsend нужно было число именно в 16-ричной системе. А оказалось, оно видимо, его автоматом конвертирует, или так понимает.
если в сериал выводить - там понятно, подставляешь во второе значение HEX, и оно выводится. А мне в ИК нужно передать было.
Да, преобразовал нормально. Смутило то, что для команды irsend нужно было число именно в 16-ричной системе. А оказалось, оно видимо, его автоматом конвертирует, или так понимает.
если в сериал выводить - там понятно, подставляешь во второе значение HEX, и оно выводится. А мне в ИК нужно передать было.
Все целые числа в МК представлены одинаково. BIN, HEX или DEC - это уже представление для человека. Всё остальное Ваши домыслы. Чтобы передать целое число, не нужно его преобразовывать в HEX или другую систему счисления. https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BB%D0%BE%D0%B5_(%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)