И снова перевести String в int

Artemiy
Offline
Зарегистрирован: 20.10.2014

Народ, нужна помощь. 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 все это загнать посимвольно?

Araris
Offline
Зарегистрирован: 09.11.2012

Обычно в таких случаях еще пишут "обыскал весь Интернет".

Почитайте про string.toInt() и string.toCharArray(buf, len)

Artemiy
Offline
Зарегистрирован: 20.10.2014

Спасибо, string.toCharArray помогло.

а как теперь число можно перегнать в вид 0x12345678 из 12345678? или как его в HEX передать как есть?

Artemiy
Offline
Зарегистрирован: 20.10.2014

Вот что вычитал:

Для функций strtol и strtoul можно указать основание системы счисления. При этом, если в качестве основания передан 0, то основание определяется автоматически по первым символам числа. Если это символ '0', а сразу за ним идет цифра - то основание принимается равным 8. Если первая цифра '0', а за ней идет символ 'x' или 'X', то основание принимается равным 16. В остальных случаях основание принимается равным 10. В качестве цифр в этом случае можно использовать символы '0' - '9' и 'A' - 'Z' или 'a' - 'z', а основание может принимать значения от 2 до 36.

char testChar1[11];
            readString.substring(8, 18).toCharArray(testChar1, 11);
            rcvcode=strtoul(testChar1, 0, 0);
            Serial.println(rcvcode);

В testChar1 у меня 0x12181110
rcvcode выводит: 303567120

Конвертнул - это и есть аналог числа 0x12181110. Теперь его надо конвертнуть обратно в нативный hex. Только как его конвертнуть и именно в "правильный" hex, с 0x спереди?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Можно попробовать: sprintf(buffer,"0x%lX", rcvcode);

Очевидно после этого вопроса возникнет еще сотня другая.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Artemiy, зачем такие сложности?

Зачем какие-то чар-эррэи - Вам некда девать память и быстродействие?

Для десятичных чисел подойдёт самая простая и эффективная функция atoi. Для шетснадцатеричных, пользуйте strtol (хоть там с 0x, хоть без). Чего мудрить-то?

  char * decNumber = "12345";
  int n = atoi(decNumber);

  char * hexNumber = "1f5e";
  n = strtol(hexNumber, NULL, 16);

  hexNumber = "0x1f5e";
  n = strtol(hexNumber, NULL, 16);

 

Artemiy
Offline
Зарегистрирован: 20.10.2014

ЕвгенийП, я так делал, но мне вместо 0x12345678 возвращается его 16-ричная производная. 305419896

Вот код:

unsigned long rcvcode;
    char testChar1[11];
            if (readString.substring(0, 3)=="GET") {
            readString.substring(8, 18).toCharArray(testChar1, 11);
            rcvcode=strtol(testChar1, NULL, 16);
            Serial.println(rcvcode);
            Serial.println(testChar1);
           }

Выводит в сериал: 

305419896
0x12345678
Для этого я и конвертировал строку сначала в char, а потом в int.
Насчет быстродействия - я же говорю, слабо рублю в этих конвертациях. Пришел из PHP - там таких вопросов не было. Здесь же хочу разобраться, как есть получить строку 0x12345678, но в виде числа 16-ричного.
 
Всё, всем спасибо, вопрос снят. Жаль, что моих мозгов не хватило разобраться с конвертацией данных. Но скетч делал всё как надо и слал в нужной системе команду.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, так 305419896 это и есть 0x12345678. Т.е. Вы нормально преобразовали строку в число. А чего нужно-то? Вы хотите. чтобы Serial Вам в шестнадцатиричном печатал? Так скажите ему (второй параметр print - система счисления). 

Artemiy
Offline
Зарегистрирован: 20.10.2014

Да, преобразовал нормально. Смутило то, что для команды irsend нужно было число именно в 16-ричной системе. А оказалось, оно видимо, его автоматом конвертирует, или так понимает.

если в сериал выводить - там понятно, подставляешь во второе значение HEX, и оно выводится. А мне в ИК нужно передать было.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Artemiy пишет:

Да, преобразовал нормально. Смутило то, что для команды 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)