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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4097|回复: 6

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

[复制链接]
发表于 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[8] = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };


或者说

String str = "39,09,70,50,00,20,00,E0 ";//没 0x
转换成这个
uint8_t state[8] = {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[count] = 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[index],base);//以base进制方式打印输出
    }
    /****方便调试看结果***/
    free(code_array);  //释放分配的内存
}
/*********************************************************************************************************************/
void loop()
{
    //for(;;);
}
/*********************************************************************************************************************/




















发表于 2020-4-12 16:21 | 显示全部楼层
如果服务器传来的是 ASCII 字串的话,就需要你自己用 sscanf 来写了
 楼主| 发表于 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[8] = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };


或者说

String str = "39,09,70,50,00,20,00,E0 ";//没 0x
转换成这个
uint8_t state[8] = {0x39,0x09,0x70,0x50,0x00,0x20,0x00,0xE0 };

能具体点吗?谢谢!
发表于 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
 楼主| 发表于 2020-4-13 12:19 | 显示全部楼层
本帖最后由 lbq691477940 于 2020-4-13 12:21 编辑
t3486784401 发表于 2020-4-13 00:56
大致需要先预处理,0x 之类的全都去掉,逗号、空格也要去掉;
然后逐个字符判断 ASCII 数值('0'~'9', 'A ...

谢谢回复,已自我搞好了,基本满足自己要求了.

发表于 2022-3-8 20:08 | 显示全部楼层
lbq691477940 发表于 2020-4-13 12:19
谢谢回复,已自我搞好了,基本满足自己要求了.

请问一下怎么实现的吗?
发表于 2022-4-27 17:44 | 显示全部楼层
lbq691477940 发表于 2020-4-13 12:19
谢谢回复,已自我搞好了,基本满足自己要求了.

你好,请问是怎么实现的?能提供下代码吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 05:50 , Processed in 0.073600 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表