Перевод форматов: uint8_t в String

Михаил З
Offline
Зарегистрирован: 22.03.2020

Проблема с конвертацией форматов.

Есть библиотека EtherCard.h

есть там такая переменная static uint8_t myip[4];   ///< IP address

которая выдаёт через 

ether.printIp("My IP: ", ether.myip);

IP адрес, сетевой

пробовал много разного, но правильной картины не получил.

как это преобразовать в строку?

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

Много разного - это что?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Михаил З пишет:

1.пробовал много разного

2.как это преобразовать в строку?

1. ;)) тут бы подробностей

2. "это" это что? 4 байта адреса? каждый байт сперва в инт, потом itoa().

==============

бонусом: string-ами на ардуино не стоит пользоваться, если это не ESP. Памяти мало.

b707
Offline
Зарегистрирован: 26.05.2017

Михаил З пишет:

пробовал много разного, но правильной картины не получил.

показывайте, как пробовали.

 

Михаил, вы заполонили конфу, откровенно говоря, тупыми вопросами. Возьмите себе за правило, прежде чем писать на форум - хоть немного пытаться разобраться самому.

Михаил З
Offline
Зарегистрирован: 22.03.2020

b707 пишет:

Михаил З пишет:

пробовал много разного, но правильной картины не получил.

показывайте, как пробовали.

 

Михаил, вы заполонили конфу, откровенно говоря, тупыми вопросами. Возьмите себе за правило, прежде чем писать на форум - хоть немного пытаться разобраться самому.

char *convert(uint8_t *a)
{

char buf[3 * 4 + 3 * 1 + 1];
snprintf(buf, sizeof(buf), " % d. % d. % d. % d", a[0], a[1], a[2], a[3]);
//uart_send(buf);

return buf;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

И каков результат?

Михаил З
Offline
Зарегистрирован: 22.03.2020

b707 пишет:

И каков результат?

 

ether.printIp("My IP: ", ether.myip);
   ether.printIp("Netmask: ", ether.netmask);
   ether.printIp("GW IP: ", ether.gwip);
   ether.printIp("DNS IP: ", ether.dnsip);
   String e = convert(ether.myip);
   Serial.println(e);
// конвертация IP адреса в строку
char *convert(uint8_t *a)
{

char buf[3 * 4 + 3 * 1 + 1];
snprintf(buf, sizeof(buf), " % d. % d. % d. % d", a[0], a[1], a[2], a[3]);
//uart_send(buf);

return buf;
}

ответ пустой

MAC: 74:69:69:2D:30:32
Контроллер инициализирован
Setting up DHCP
My IP: 192.168.1.169
Netmask: 255.255.255.0
GW IP: 192.168.1.1
DNS IP: 192.168.1.1
 
Поехали
 

 

b707
Offline
Зарегистрирован: 26.05.2017

У вас процедура возвращает char* , зачем вы ее в String запихиваете? Компилятор не ругается?

Кроме этого , ваш массив buf, созданный в строке 5 - локальный для процедуры. Снаружи процедуры он, вообще-то, существовать не должен, хотя может.

В третьих, нужную длину буфера хорошо посчитали? - по мне так ее не хватает. Пробелы не забывайте считать, вы их там насажали немеряно.

 

пока хватит, справьте это и приходите снова.

И еще раз повторю - пытайтесь разобраться в проблеме сами. Если вы этому не научитесь (самостоятельно находить решение) - даже не пытайтесь писать программы сами, ничего не выйдет. Тогда ваш удел - тупо повторять чужие проекты, Гайвера например :)

Михаил З
Offline
Зарегистрирован: 22.03.2020

решил вопрос через 

IPAddress mylocalIP(ether.myip[0], ether.myip[1], ether.myip[2], ether.myip[3]);

b707
Offline
Зарегистрирован: 26.05.2017

Михаил З пишет:

решил вопрос через 

IPAddress mylocalIP(ether.myip[0], ether.myip[1], ether.myip[2], ether.myip[3]);

и какой вопрос вы так решили? перевода адреса в строку?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Зачем на ардуино вообще String? В чем практическое преимущество и где это вообще может пригодиться?

Izvekoff
Offline
Зарегистрирован: 02.03.2020

BOOM пишет:

Зачем на ардуино вообще String? В чем практическое преимущество и где это вообще может пригодиться?

в выводе на tft экран, не?

FoxJone
Offline
Зарегистрирован: 19.04.2019

BOOM пишет:

Зачем на ардуино вообще String? В чем практическое преимущество и где это вообще может пригодиться?

String очень удобен именно в работе со строками. Куча методов для парсинга и составления нужной строки. Вывод на всякие экраны, вывод на веб-интерфейс, да мало ли куда еще.

Другое дело, что памяти он жрет как не в себя, но если памяти хватает, то почему бы и нет? МК это не компьютер, сэкономленную память вы все равно никуда не потратите.

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

FoxJone пишет:

памяти он жрет как не в себя

6 байт ОЗУ на служебные данные + сама строка, остальное (1.5 кБ PROGMEM) - разделяемый между всеми экземплярами код. :)  Не так уж и много, я щитаю, особенно на "жирных" контроллерах. В конце концов, если самому активно работать со строкой через стандартные функции strxxx()  выйдет не намного меньше. :)  А головняков у начинающих - по самые гнилые помидоры. :) 

FoxJone
Offline
Зарегистрирован: 19.04.2019

Тут должна быть классическая история про страдания хардкорного программиста, который неделю оптимизировал прошивку с целью убрать один лишний байт, но вы наверняка ее читали :)

Лично я регулярно использую String в своих проектах, это сильно экономит мое время. Проекты работают, заказчики довольны. Обычный инструмент, вполне удобный.

Другое дело, что некоторые суют этот String куда ни попадя (например хранят в нем IP-адрес) или шлют/читают посылки по Serial (многие уверены, что Serial вообще работает с символами). Но это уж на их совести :)

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

FoxJone пишет:

Лично я регулярно использую String в своих проектах, это сильно экономит мое время. Проекты работают, заказчики довольны. Обычный инструмент, вполне удобный.

Другое дело, что некоторые суют этот String куда ни попадя ...

Ничего не могу возразить. :) 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А можно глупый вопрос?

В «классическом» Си и Си++ вроде как бы вместо стринга массив символов использовался всегда (если память не изменяет, писал давным давно на Си/Си++), оканчивающийся ‘\0’ (знак конца «строки»). Конечно это сложнее стринга в работе с ним, но выигрыш в сравнении со стрингом есть какой (в памяти, к примеру) или «пофиг»?

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

У ASCIIZ накладных расходов - указатель и терминатор. Три байта, выходит. А у String - 6, как Семён пишет.

b707
Offline
Зарегистрирован: 26.05.2017

Накладные расходы начинаются, когда вы начинаете писать строчки типа

String result = " Parameter k= " + String(k) + " Time = " + String(t);

 

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

Да в оконцовке всё равно один обьект останется, все временные почат в бозе, оставляя после себя дыры в памяти. :)