请教大家一下字符串转换成十六进制数(已解决)-Arduino中文社区 - Powered by Discuz! Archiver

lbq691477940 发表于 2020-4-12 15:46

请教大家一下字符串转换成十六进制数(已解决)

本帖最后由 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(;;);
}
/*********************************************************************************************************************/




















t3486784401 发表于 2020-4-12 16:21

如果服务器传来的是 ASCII 字串的话,就需要你自己用 sscanf 来写了

lbq691477940 发表于 2020-4-12 17:29

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 };

能具体点吗?谢谢!

t3486784401 发表于 2020-4-13 00:56

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:19

本帖最后由 lbq691477940 于 2020-4-13 12:21 编辑

t3486784401 发表于 2020-4-13 00:56
大致需要先预处理,0x 之类的全都去掉,逗号、空格也要去掉;
然后逐个字符判断 ASCII 数值('0'~'9', 'A ...
谢谢回复,已自我搞好了,基本满足自己要求了.

MachreeMinoCCC 发表于 2022-3-8 20:08

lbq691477940 发表于 2020-4-13 12:19
谢谢回复,已自我搞好了,基本满足自己要求了.

请问一下怎么实现的吗?

yxkr 发表于 2022-4-27 17:44

lbq691477940 发表于 2020-4-13 12:19
谢谢回复,已自我搞好了,基本满足自己要求了.

你好,请问是怎么实现的?能提供下代码吗?
页: [1]
查看完整版本: 请教大家一下字符串转换成十六进制数(已解决)