串口编程 - ascii字符与16进制的相互转换

这篇具有很好参考价值的文章主要介绍了串口编程 - ascii字符与16进制的相互转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

串口编程 - ascii字符与16进制的相互转换


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

前言

计算中所有数据的存储和运算都是使用二进制表示的,这种表示法便于计算机处理,但不便于人类理解。因此便产生了信息编码的概念。

信息编码(Information Coding),即用不同的代码与各种信息中的基本单位组成部分建立一一对应的关系。如计算机中常用的信息编码ASCII码。

串口通信中数据传输也都是使用二进制。为了便于展示或存储,会存在ascii字符与16进制之间的转换,如以ascii方式发送数据,对方以16进制方式进行展示或者以16进制方式发送,对方以ascii方式展示等。

1. 16进制转换为16进制ascii字符

用途:

  • 可用于串口数据接收时,将16进制数据转换为16进制ascii字符
  • 串口调试助手hex显示

示例:0x30 直接展示为 30 两个ascii码

#include <stdio.h>
#include <iostream>

int main()
{
	int recLen = 0;
	char hexChar[3];// two bit hex +  '\0'
	char * receiveStr = NULL;
	receiveStr = new char[1024];

	// mock read
    // recLen = p_sp->readAllData(str);
	receiveStr[0] = 0x00;
	receiveStr[1] = 0x11;
	receiveStr[2] = 0x22;
	receiveStr[3] = 0x33;
	receiveStr[4] = 0x44;
	recLen = 5;

	// convert to hex string
	for (int i = 0; i < recLen; i++)
	{
		snprintf(hexChar, sizeof(hexChar), "%02X", receiveStr[i] & 0xFF);// two bit hex + '\0'
		hexChar[sizeof(hexChar) - 1] = '\0';
		std::cout << hexChar;
	}

	if (receiveStr) 
	{
		delete[] receiveStr;
		receiveStr = NULL;
	}

    return 0;
}

2. ascii字符转换为16进制

用途:

  • 可用于串口发送时,获取ascii字符串对应的16进制数据
  • 串口调试助手hex发送

示例:ascii码0 转换为 0x30

char * HexStrFilter(char *charStr, char *fiterStr)
{
    if (charStr == NULL || fiterStr == NULL)
    {
        return NULL;
    }

    int len = strlen(charStr);

    char *pTemp = fiterStr;

    for(int i = 0; i < len; i++)
    {
        if( ((charStr[i] >= '0') && (charStr[i] <= '9')) ||
            ((charStr[i] >= 'A') && (charStr[i] <= 'F')) ||
            ((charStr[i] >= 'a') && (charStr[i] <= 'f')) )
        {
            *fiterStr++ = charStr[i];
        }
    }

    return pTemp;
}

char CombineHexChar(char charH,char charL) /// CombineHexChar(A,B) result=1011;
{
    char result;

    if(charH >= '0' && charH <= '9')
    {
        result = (charH - '0');
    }
    else if(charH >= 'a' && charH <= 'f')
    {
        result = (charH - 'a'+10);
    }
    else if(charH >= 'A' && charH <= 'F')
    {
        result = (charH - 'A' + 10);
    }
    else
    {
        result = 0;/// need to fiter non-hex character
    }

    result <<= 4;

    if(charL >= '0' && charL <= '9')
    {
        result += (charL - '0');
    }
    else if(charL >= 'a' && charL <= 'f')
    {
        result += (charL - 'a'+10);
    }
    else if(charL >= 'A' && charL <= 'F')
    {
        result += (charL - 'A' + 10);
    }
    else
    {
        result += 0;
    }

    return result;
}

int Char2Hex(char *charStr,char *hexStr)/// character to hex, return value is hexStr length
{
    if (charStr == NULL || hexStr == NULL)
    {
        return 0;
    }

    int hexStrCount = 0;

    char *fiterStr = NULL;
    fiterStr = new char[strlen(charStr) + 1];
    memset(fiterStr,0,strlen(charStr) + 1);

    HexStrFilter(charStr,fiterStr);///filter non-hex character

    int len = strlen(fiterStr);

    // warn: if charStr length not even, the last charactor will lost
    for(int i=0;i < len/2; i++)
    {
        *hexStr++ = CombineHexChar(fiterStr[i*2],fiterStr[i*2+1]);
        hexStrCount++;
    }

    if(fiterStr)
    {
        delete [] fiterStr;
        fiterStr = NULL;
    }

    return hexStrCount;
}

发送

char charStr[] = "0123456789";
 int len = strlen(charStr);
char *hexStr = NULL;
hexStr = new char[len + 1];
memset(hexStr,0,len + 1);

int hexStrLen = 0;
hexStrLen = Char2Hex(charStr,hexStr);

m_serialPort.writeData(hexStr,hexStrLen );

if(hexStr)
{
    delete [] hexStr;
    hexStr = NULL;


License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033


Reference:文章来源地址https://www.toymoban.com/news/detail-410423.html

  1. https://github.com/itas109/CSerialPort
  2. https://github.com/itas109/CSerialPort/issues/38

到了这里,关于串口编程 - ascii字符与16进制的相互转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中str、bytes、十六进制字符串的相互转换

    python中str、bytes、十六进制字符串的介绍 str是python的内置函数,str字符串在python中使用 \\\'\\\' 或者 \\\"\\\" 括起来的字符串,比如: bytes也是python的内置函数,bytes字符串通常以b开头,比如: 十六进制字符串是指字符串中每个字符表示一个十六进制数,两个字符组成一个字节,比如

    2024年02月21日
    浏览(54)
  • MFC 编辑框输入16进制字符串转换为16进制数或者10进制数据计算

    1. 编辑框添加变量,并选择变量类型为CString。     CString m_strReg;        DDX_Text(pDX, IDC_EDIT_REG, m_strReg); 2. 使用“strtoul”或“_tcstoul”函数将Cstring 类型转换为16进制/10进制数进行计算。     CString tmp;     UpdateData(TRUE);     UpdateData(FALSE);          OutputDebugString(m_strReg);  

    2024年02月16日
    浏览(59)
  • C语言字符串转换为16进制

    方法二:自定义转换函数 输出结果: 这两种方法都可以将C语言字符串逐个字符转换为对应的16进制表示。第一种方法使用了sprintf函数来格式化输出,第二种方法则是通过强制类型转换将字符转换为无符号字符(unsigned char),然后使用printf函数输出对应的十六进制表示。

    2024年02月05日
    浏览(59)
  • 【byte类型数据转换16进制字符串】

    1.byte类型数据长度为8bit(8位), 例如00101110。 2.16进制字符长度4bit(4位), 例如1101,表示D。 3.那么一个byte可以用2(8bit/4bit=2)个16进制字符表示。 4. 1中的00101110可分为0010和1110两部分。 5. 0010可以由00101110右移动4位获得,即001011104。注意,在java中byte是无符号的,全为正的,所有应该做

    2024年02月16日
    浏览(55)
  • C#底层库--任意进制转换器(可自定义顺序字符,2、4、8、16、18进制都支持)

    C#底层库–RegexHelper正则表达式辅助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/109745286 C#底层库–程序日志记录类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709 C#底层库–排序算法帮助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124495730 C#底层库–

    2024年02月06日
    浏览(55)
  • 二进制与十进制的转换【相互转换, C++】

    二进制转十进制: 以字符串的形式读入二进制串。 获得该字符串的位数,即二进制的最高位是多少。 从左往右遍历 == 从高位往低位展开! 核心:按权展开,按位相加。 代码: 十进制转换为二进制: 思路: 十进制转化为 x x x 进制采用的是除 x x x 取余法(从下往上取余数

    2024年02月12日
    浏览(64)
  • ASCII码与C语言字符转换教程

    探索ASCII码表及如何在C语言中实现数字与字符之间的转换。学习字符’0’至’9’、\'A’至’Z’和’a’至’z’的ASCII值及转换代码示例。

    2024年02月07日
    浏览(27)
  • (超简单)将图片转换为ASCII字符图像

    将一张图片转换为ASCII字符图像 原图: 效果图:

    2024年02月10日
    浏览(30)
  • ASCII码与字符对照表(附转换代码)

    目录 ASCII基本字符 ASCII控制字符 ASCII可显示字符 ASCII扩展字符 转换代码 ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母、数字 0 到 9、标点符号, 以及在美式英语中使用

    2024年02月02日
    浏览(42)
  • Java 中图片与二进制之间如何相互转换?

    1、 下面是一个完整的代码示例。 指定文件路径转为二进制 将网络图片转为二进制 base64 转为图片资源 2、如何判断 base64 图片的格式? 3、将网络图片转为 base64 字符串 4、将 base64 字符串转为图片输出 注:该方法的入参,base64 格式文件不得有 文件头部标识信息,否则会转换

    2024年02月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包