Преобразовать sTring в byte?

FredP
Offline
Зарегистрирован: 18.02.2019

Получаю от библиотеки MQTT текстовое (String) значение 00000101 в переменной payload. Как мне записать его в byte, что бы получилось число 5?

Вот такой код почему то не работает. В цикле for в массиве temp почему то только единицы...

 

    if (topic == "/md/infobyte") {
    bool temp[8];
    byte finish_byte;

    for (byte i = 0; i <= 7; i++){
    if (payload.charAt(i)=="0")
    {temp[i]=0;}
    else
    {temp[i]=1;}
    bitWrite(finish_byte, i, temp[i]);}
    Serial.print(finish_byte);
    }

 

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

"0" - это не char, а char[]. При использовании char используются одинарные кавычки.

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

sadman41 пишет:

"0" - это не char, а char[]. При использовании char используются одинарные кавычки.

Это первая серия. Но сериал имеет и продолжение :)

FredP
Offline
Зарегистрирован: 18.02.2019

Спасибо. Получилось.

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

ЕвгенийП пишет:

Это первая серия. Но сериал имеет и продолжение :)

Мне кажется, что не сериал, а гораздо хуже - непрекращающийся День Сурка.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Немногим лучше 

 

int binStrToInt(String &input) {
	int result = 0;
	for (byte i = 0; i < input.length(); i++) {
		result <<= 1;
		if (input[i] == '1') result |= 1;
		else if (input[i] != '0'){
                 result>>=1;
                 break;
                }
	}
	return result;
}

 

FredP
Offline
Зарегистрирован: 18.02.2019

ЕвгенийП пишет:

Получилось, но будут неожиданные, ниоткуда появляющиеся глюки. Думайте, почему.

не придумывается =( говорите, не таите знания ;)

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

Нули он тоже пихает... просто форматирование кода кривое.

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

sadman41 пишет:

Нули он тоже пихает... просто форматирование кода кривое.

Виноват, не заметил. Удаляю свой пост.

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

DetSimen пишет:

int binStrToInt(String &input) {
	int result = 0;
	for (byte i = 0; i < input.length(); i++) {
		result <<= 1;
		if (input[i] == '1') result |= 1;
		else if (input[i] != '0'){
                 result>>=1;
                 break;
                }
	}
	return result;
}

Я, конечно, могу ошибаться, но у меня сложилось впечатление, что шифтование знаковых переменных - это игра с огнём. К тому же тут есть шанс получить на выходе странное, если строка вдруг оказалась подлиннее, чем 8 chars.

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

 если строка вдруг оказалась подлиннее, чем 8 chars.

16

 

да, uint здесь уместнее. 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

Я, конечно, могу ошибаться, но у меня сложилось впечатление, что шифтование знаковых переменных - это игра с огнём. К тому же тут есть шанс получить на выходе странное, если строка вдруг оказалась подлиннее, чем 8 chars.

Знаковые вправо шифтовать надо осторожно, а влево, памойму, пофик. 

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

DetSimen пишет:

Знаковые вправо шифтовать надо осторожно, а влево, памойму, пофик. 

Ну вот я и обратил внимание на result>>=1;