请教大家一下字符串转换成十六进制数(已解决)
本帖最后由 lbq691477940 于 2020-4-13 12:20 编辑请教大家一下 arduino 怎样将一个 64位的十六进制字符转换成十六进制数
比如我收到服务器传过来的 0x39097050002000E0 这么一串字符怎样转换成十六进制数
又或者说收到服务器传过来的 0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 这8个十六进制字符串,怎样转换成对应的8个十六进制,构成一个数组
用哪个函数可以实现
谢谢!即要将
String str = "0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 ";//有 0x
转换成这个
uint8_t state = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };
或者说
将
String str = "39,09,70,50,00,20,00,E0 ";//没 0x
转换成这个
uint8_t state = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };
String str = "4538,550,594,548,594,548,594,548,594,548,592,548,594,548,594,548,594,548,1704,548,1704";
String str1 = "0x79,0x09,0x70,0x50,0x01,0x20,0x00,0xE0";
String str2 = "F9,FB,7C,5A,D1,2A,FF,ED";
/*********************************************************************************************************************/
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap()); //ESP.getFreeHeap();//返回空闲堆大小
/*
Serial.println(str.length()); //返回str字符串的长度;从1开始计算所以本例返回(35)
Serial.println(str.indexOf('5')); //返回被寻找的字符串第一次出现要寻找字符的位置;从0开始计算所以本例返回(4)
Serial.println(str.indexOf('5',5));//返回被寻找的字符串第一次出现要寻找字符的位置;指定从第5个开始找所以没有故本例返回(-1)
Serial.println(str.indexOf("56")); //返回被寻找的字符串第一次出现要寻找字符的位置;从0开始计算所以本例返回(4)
Serial.println(str.indexOf("51")); //返回被寻找的字符串第一次出现要寻找字符的位置;从0开始计算,因为被找字符串没有51所以本例返回(-1)
Serial.println(str.substring(5)); //从给定位置截取字符串默认直到末尾返回值是String;本例返回(6789abcdefghijklmnopqrstuvwxyz)
Serial.println(str.substring(5,10)); //从给定开始位置到指定结束位置截取字符串默认直到末尾返回值是String;本例返回(6789a)
str.trim(); //返回一个去前后空格的字符串
str.toUpperCase(); //把字符串全部转为大写
*/
Serial.println(str);
//调用测试:
send_String(str,DEC);
Serial.println(str1);
//调用测试:
send_String(str1,HEX);
Serial.println(str2);
//调用测试:
send_String(str2,HEX);
}
/*********************************************************************************************************************/
void send_String(String str,int base) //将服务器传过来的字符串转为整数
{
uint16_t *code_array;
int16_t index = -1;
uint16_t count = 1;
do //执行检测逗号
{
index = str.indexOf(',',index + 1);
count++;
}while(index != -1);//只要有逗号则一直执行
code_array = reinterpret_cast<uint16_t*>(malloc(count * sizeof(uint16_t)));
if(code_array == NULL) //检查我们是否成功分配了
{
ESP.restart();//重启
delay(500); //等待重启
return; //不应该到达这里,但以防万一
}
count = 0;
uint16_t start_from = 0;
do
{
index = str.indexOf(',',start_from);
code_array = strtoul(str.substring(start_from,index).c_str(),NULL,base);//转换成十六进制值存在数组中
start_from = index + 1;
count++;
} while(index != -1);//只要有逗号则一直执行
/****方便调试看结果***/
Serial.println(count);//查看逗号个数(会比实际逗号个数多1个)
for(index = 0;index < count;index++)
{
Serial.println(code_array,base);//以base进制方式打印输出
}
/****方便调试看结果***/
free(code_array);//释放分配的内存
}
/*********************************************************************************************************************/
void loop()
{
//for(;;);
}
/*********************************************************************************************************************/
如果服务器传来的是 ASCII 字串的话,就需要你自己用 sscanf 来写了 t3486784401 发表于 2020-4-12 16:21
如果服务器传来的是 ASCII 字串的话,就需要你自己用 sscanf 来写了
相当于是要将
String str = "0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 ";//有 0x
转换成这个
uint8_t state = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };
或者说
将
String str = "39,09,70,50,00,20,00,E0 ";//没 0x
转换成这个
uint8_t state = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };
能具体点吗?谢谢!
lbq691477940 发表于 2020-4-12 17:29
相当于是要将
String str = "0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 ";//有 0x
转换成这个
大致需要先预处理,0x 之类的全都去掉,逗号、空格也要去掉;
然后逐个字符判断 ASCII 数值('0'~'9', 'A'~'F', 'a'~'f'),运算后一个个压入字节数组。
非要写一遍的话,建议联系我qq/微信:974604330 本帖最后由 lbq691477940 于 2020-4-13 12:21 编辑
t3486784401 发表于 2020-4-13 00:56
大致需要先预处理,0x 之类的全都去掉,逗号、空格也要去掉;
然后逐个字符判断 ASCII 数值('0'~'9', 'A ...
谢谢回复,已自我搞好了,基本满足自己要求了.
lbq691477940 发表于 2020-4-13 12:19
谢谢回复,已自我搞好了,基本满足自己要求了.
请问一下怎么实现的吗? lbq691477940 发表于 2020-4-13 12:19
谢谢回复,已自我搞好了,基本满足自己要求了.
你好,请问是怎么实现的?能提供下代码吗?
页:
[1]