Dus*_*tic 0 c++ arduino esp8266 esp32
在SPIFFS中的文件内,我将以"XX:XX:XX:XX:XX:XX"的形式保存有关mac地址的信息.当我读取文件时,我需要将它从STRING切换为十六进制值数组.
uint8_t* str2mac(char* mac){
uint8_t bytes[6];
int values[6];
int i;
if( 6 == sscanf( mac, "%x:%x:%x:%x:%x:%x%*c",&values[0], &values[1], &values[2],&values[3], &values[4], &values[5] ) ){
/* convert to uint8_t */
for( i = 0; i < 6; ++i )bytes[i] = (uint8_t) values[i];
}else{
/* invalid mac */
}
return bytes;
}
wifi_set_macaddr(STATION_IF, str2mac((char*)readFileSPIFFS("/mac.txt").c_str()));
Run Code Online (Sandbox Code Playgroud)
但我在某处的代码中错了
当我AA:00:00:00:00:01
输入文件时,我的ESP8266设置29:D5:23:40:00:00
我需要帮助,谢谢
您正在返回指向"本地"变量的指针,即在函数完成时生命周期结束的变量.然后使用这样的指针是UB,例如,它可能是您正在看到的行为.
为了克服这个问题,你可以将数组作为参数传递; 然后调用者负责内存管理.顺便说一句:您可以使用格式%hhx
直接读入8位无符号数据类型:
int str2mac(const char* mac, uint8_t* values){
if( 6 == sscanf( mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",&values[0], &values[1], &values[2],&values[3], &values[4], &values[5] ) ){
return 1;
}else{
return 0;
}
}
int main() {
uint8_t values[6] = { 0 };
int success = str2mac("AA:00:00:00:00:01", values);
if (success) {
for (int i=0; i<6; i++) {
printf("%02X:",values[i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)