ASCII --> int

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017

Здраствуйте. Потребовалось вытаскивать ASCII символы из уарта и переводить их в обычные числа (Общение с частотником). Строка имеет следующий вид [EOT 14 STX 2A19 0003 ETX]. Ну понятно что адрес инвертора, номер параметра и значение. И что бы переводить значения частот в int написал функцию. Правильно ли она написана?

unsigned int Str_to_Int(unsigned char* Str1, unsigned char Frst_Val, unsigned char Lst_Val)
{
    unsigned char temp_buff[5] = {0};
    unsigned char i;
    for(i = Frst_Val; i <= Lst_Val; i++)
    {
        if((Str1[i] >= 'A') && (Str1[i] <= 'F'))
        {
            temp_buff[(i - Frst_Val)] = Str1[i] - 55;
        }
        else if((Str1[i] >= '0') && (Str1[i] <= '9'))
        {
            temp_buff[(i - Frst_Val)] = Str1[i] - 48;
        }
    }
    return ((temp_buff[0] << 12) | (temp_buff[1] << 8) | (temp_buff[2] << 4) | (temp_buff[3]));
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Похвально, конечно, но есть способ проще: int x = atoi(&buffer[n]), где n - позиция, с которой в строке начинается ваше число. Правда, эта функция должна поймать \0 в конце строки, но думаю, что вы этот впрос решите.

 

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017

sadman41 пишет:

Похвально, конечно, но есть способ проще: int x = atoi(&buffer[n]), где n - позиция, с которой в строке начинается ваше число. Правда, эта функция должна поймать \0 в конце строки, но думаю, что вы этот впрос решите.

 

Все как всегда оказывается намного проще. Обязательно попробую ваше решение.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Идеологически правильно из этой строки [EOT 14 STX 2A19 0003 ETX]. получить это int argc, char* argv[] a потом уже извлекать все остальное.http://cppstudio.com/post/421/

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017

Прочитав описание функции atoi, пришел к выводу что она скорее всего не подойдет, так как частота задается от 0000 до FFFF, тогда как atoi обрабатывает только числовые знаки игнорируя буквы

sadman41
Offline
Зарегистрирован: 19.10.2016

Вам сложно угодить. Почитайте про http://www.cplusplus.com/reference/cstdlib/strtol/

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

semaawp пишет:
Прочитав описание функции atoi, пришел к выводу что она скорее всего не подойдет, так как частота задается от 0000 до FFFF, тогда как atoi обрабатывает только числовые знаки игнорируя буквы

А вы в курсе что 0x1234= ((1*16+2)*16+3)*16+4 Легко написать конвертер самому

пс 0x1234= ((1<<4+2)<<4+3)<<4+4