• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

字符串转换的问题,急!

fd38f4f3178d6cb1 2018-06-27 浏览量:852
我在串口上收到一个12位的字符串,比如是“1122334455EF”,怎么样转换成一个unsigned char的{0x110x220x330x440x550xEF}
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个给你个函数,可以自己看看原理。

    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓   通用函数的实现   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    int Str2Hex(int InLen char *InBuffer BYTE *OutArray)
    {
    	int  i = 0j = 0;
        char tmp;
    	if(InLen%2) return 0;//数据不为偶数,有一位十六进制数少一位数据
        for( i=0j=0;i < InLen;)
        {
    		if(isxdigit(InBuffer[i])==0) return 0;//判断字符是否是十六进制字符
    		
            if( InBuffer[i] >= 0x30 && InBuffer[i] <= 0x39 )
            {
                tmp = (InBuffer[i] - 0x30)<<4;
            }
            else if( InBuffer[i] >= 0x41 && InBuffer[i] <= 0x46 )
            {
                tmp=(InBuffer[i] - 0x37)<<4;
            }
            else if( InBuffer[i] >= 0x61 && InBuffer[i] <= 0x66 )
            {
                tmp=(InBuffer[i] - 0x57)<<4; 	
            }
            i++;
    		
            if( InBuffer[i] >= 0x30 && InBuffer[i] <= 0x39 )
            {
                tmp = tmp | (InBuffer[i] - 0x30);
            }
            else if( InBuffer[i] >= 0x41 && InBuffer[i] <= 0x46 )
            {
                tmp= tmp | (InBuffer[i] - 0x37);
            }
            else if( InBuffer[i] >= 0x61 && InBuffer[i] <= 0x66 )
            {
                tmp =tmp | (InBuffer[i] - 0x57);
            }
    		
            OutArray[j++] = tmp;
            i++;
        }
       	return(j);
    }

    • 发布于 2018-06-29
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:17
  • 如果是转换成16进制的话,在c语言中,循环读取每个字符,在将它转换成ascii对应的值,再转换成16进制的值就好了
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 那你需要自己定义一个转换函数啊,每次取2个字符来格式化。
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • char h2c(char i){
       switch(i){
    case '0':return 0;
    case '0':return 1;
    ...
    case '9':return 9;
    case 'a':
    case 'A':return 10;
    ...
    case 'f':
    case 'F':return 15;
    }
    }
    // 假设输入数据到inchar字符数组中
    char tmp;
    char out[1000]={0};
    int inc=0
    while(inchar[inc]){
    if(inc%2==0){
    tmp=(h2c(inchar[inc]))<<4;
    }else{
    tmp=tmp | h2c(inchar[inc]);
    out[ inc/2 ] = tmp;
    }
    inc++;
    }

    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 把1122334455EF定义成数组A[],对数组进行操作。每两位操作一次在前面添加字符“0x”,strcat(ab);​连接字符串,然后保存到数组B[]。
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 其实我编了一个实现,在等待审核啊! 说有非法字符!
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 这里的112233都是字符的形式,都是ascii码,而ascii码与十六进制的数据是有一个转换关系的,通过这个关系进行计算就可以了

    有关系在这里:https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii码&fromid=99077&fr=aladdin

    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 用字符串转BCD的算法,取相邻四位ASCII码的后面两位("0xff0xee")不要'0'和'x',只要'f' 'f' 'e' 'e',取出来之后通过乘16转为HEX。

    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个是字符串与16进制的数据之前的转换问题了,可以使用BCD码进行转换算法处理
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 第一位减去0x30,然后乘16,加上第二位减去0x30。。。以此类推
    • 发布于2018-06-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 字符串的ASCII码转换成对应数字,百位数字*100+十位数字*10,找个表对照看一下,就知道怎么处理了
    • 发布于2018-06-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 定义一个3Byte的字符数组,截取源字符串,使用atoi,在将值强制赋值给char类型
    • 发布于2018-06-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 使用strncpy函数两位两位地截取,然后通过sprintf或者strcat这类函数把头部和每一位合并,最后所有字符串合并起来。
    • 发布于2018-06-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以在ASCII字符表里查找该编码对应的字符串,然后进行显示
    • 发布于2018-07-03
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种情况可以直接发送十六进制,然后再通过字符表查找到对应的字符串
    • 发布于2018-07-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果是数字的话把第一个数减0x30后右移位与上第二个数减去0x30,比如12就是,串口接收到位0x31和0x32 ,那就是(1<<4)|2=0x12

    如果是字母的话把第一个数减0x37后右移位与上第二个数减去0x37

    • 发布于2018-07-12
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

字符串转换的问题,急!