Вы не выделяете место для хранения строки C, получаемой из addressDateTime
.
hashThis
- это char*
, который является указателем на символ.Ничего не было установлено, так что это просто ... случайно.Что почти наверняка приведет к сбою вашей программы или, по крайней мере, к неправильному поведению.
Учитывая ваш код, самое быстрое решение - это изменить
char* hashThis;
на
char hasThis[30];
addressDateTime.toCharArray(hashThis, 30);
Iизменено с 28 на 30, потому что aa:bb:cc:dd:ee:ffYYmmDDhhMMss
на самом деле имеет длину 29 символов и также требует дополнительного байта для символа нулевого терминатора строки C.Я не уверен на 100%, если метод toCharArray()
устанавливает нулевой терминатор;если это не так, вам нужно добавить
hasThis[29] = '\0';
Этого можно избежать, просто используя метод String c_str()
, который возвращает char*
во внутренний буфер, который String использует для хранения
В этом случае вы можете переписать
char* hashThis;
addressDateTime.toCharArray(hashThis, 28);
как
char* hashThis = addressDateTime.c_str();
Кстати, вы также можете просто сделать
Serial.printf("%02x", hashThis[i]);
и обойтись без snprintf()
.Спасибо за получение правильного размера буфера, хотя!
ОБНОВЛЕНИЕ
В своем обновленном вопросе вы сказали, что ожидаете увидеть вывод, который выглядит следующим образом:
aa:bb:cc:dd:ee:ff190505141037
вместо:
33433a37313a42463a31443a34323a463431393035303531343038323700
Ваш код
for (int i = 0; i < sizeof(hashThis); i++) {
Serial.printf("%02x", hashThis[i]);
}
Вы пишете каждый символ в виде двухзначного шестнадцатеричного числа, поэтому вы собираетесьчтобы увидеть число в шестнадцатеричном формате, который представляет символ, а не сам символ.Если вы хотите увидеть символы, выполните:
for (int i = 0; i < strlen(hashThis); i++) {
Serial.printf("%c", hashThis[i]);
}
или (лучше)
for (int i = 0; i < strlen(hashThis); i++) {
Serial.print(hashThis[i]);
}
или (лучше)
Serial.println(hashThis);
Обратите внимание, что я изменил вашsizeof
до strlen
.Если по какой-либо причине вы поместите более короткую строку в hashThis
, strlen
будет делать правильные вещи, тогда как sizeof
всегда будет возвращать длину, с которой была объявлена hashThis
, а не длину строки в ней.