博主在日常工作中开展项目开发,经常遇到要将数据格式做转换处理,比如一段字符串转换为16进制的byte数组、或者一段16进制的byte数组转换成字符串输出等等。
现将这部分常见功能的实现分享给大家,希望对大家的学习和工作有所帮助。
//将一个双字节(16位的数值)拆分为一个数组按字节存储 如 0x1234 ==> 0x12 0x34
void uint16_2_str(uint16_t Num, uint8_t *buff2)
{
buff2[1] = (uint8_t)Num;
Num >>= 8;
buff2[0] = (uint8_t)Num;
}
//将可读的16进制串合并成其一半长度的二进制串, 如 "12AB"-->0x12AB
void asc_2_bcd(char *psIAsc, int32_t iAscLen, char *psOBcd)
{
char Chtmp,ChBcd;
int32_t iCnt;
for(iCnt = 0; iCnt < iAscLen; iCnt += 2)
{
Chtmp = psIAsc[iCnt];
if( Chtmp >= 'A' )
{
Chtmp = (char)toupper((int)Chtmp) - 'A' + 0x0A;
}
else
{
Chtmp &= 0x0F;
}
ChBcd = (Chtmp << 4); // 获取BCD的高位
Chtmp = psIAsc[iCnt+1];
if( Chtmp >= 'A' ) //zyl
{
Chtmp = (char)toupper((int)Chtmp) - 'A' + 0x0A;
}
else
{
Chtmp &= 0x0F;
}
ChBcd |= Chtmp; // 获取BCD低位
psOBcd[iCnt/2] = ChBcd;
}
}
//将二进制源串分解成双倍长度可读的16进制串, 如 0x12AB-->"12AB"
void bcd_2_asc(uint8_t *psIHex, int32_t iHexLen, char *psOAsc)
{
static const char szMapTable[17] = {"0123456789ABCDEF"};
int32_t iCnt,index;
unsigned char ChTemp;
for(iCnt = 0; iCnt < iHexLen; iCnt++)
{
ChTemp = (unsigned char)psIHex[iCnt];
index = (ChTemp / 16) & 0x0F;
psOAsc[2*iCnt] = szMapTable[index];
ChTemp = (unsigned char) psIHex[iCnt];
index = ChTemp & 0x0F;
psOAsc[2*iCnt + 1] = szMapTable[index];
}
}
// 同bcd_2_asc()函数,并在目标串后添一 '\0'
void bcd_2_asc0(uint8_t *psIHex, int32_t iHexLen, char *pszOAsc)
{
bcd_2_asc((uint8_t *)psIHex, iHexLen, pszOAsc);
pszOAsc[2*iHexLen] = 0;
}
// 对一段字符串pszString填充前导字符ChAddChar,以便达到uiTargetLen长度
static void add_head_chars( char *pszString, int32_t iTargetLen, char ChAddChar )
{
int32_t iLen;
iLen = strlen((char *)pszString);
if( iLen>=iTargetLen )
{
return;
}
memmove(pszString+iTargetLen-iLen, pszString, iLen+1);
memset(pszString, ChAddChar, iTargetLen-iLen);
}
// 删除一个字符串pszString中的前导字符ChRemoveChar
static void trim_head_chars(char *pszString, char ChRemoveChar)
{
char *p;
if( !pszString || !*pszString )
{
return;
}
for(p=pszString; *p && *p==ChRemoveChar; p++);
if( p!=pszString )
{
while( (*pszString++ = *p++) );
}
}
//以一个字符串str,以delim为分割符号,分割成多个字符串,返回分割后的首地址
char *my_strtok(char *src, const char *delim, char *dst)
{
if (src && *src)
{
char *p = strstr(src, delim);
if (p)
{
if (dst)
{
memcpy(dst, src, (p-src));
}
return ++p;
}
else
{
if (dst)
{
strcpy(dst, src);
}
return NULL;
}
}
else
{
return NULL;
}
}
这几个转换函数都是很实用的基础函数,比如把一串字符串转换为16进制的数组,或者把一个16进制的数组转换为一个可显示的字符串,在应用程序中是一种很常见的数据转换。
大家如对实现代码有疑问,欢迎在评论席给我留言。 @_@ ...
架构师李肯
架构师李肯(全网同名),一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获CSDN博客专家、CSDN物联网领域优质创作者、2021年度CSDN&RT-Thread技术社区之星、2022年RT-Thread全球技术大会讲师、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!
欢迎关注我的gitee仓库01workstation ,日常分享一些开发笔记和项目实战,欢迎指正问题。
同时也非常欢迎关注我的CSDN主页和专栏:
【CSDN主页-架构师李肯】
【RT-Thread主页-架构师李肯】
【C/C++语言编程专栏】
【GCC专栏】
【信息安全专栏】
【RT-Thread开发笔记】
【freeRTOS开发笔记】
有问题的话,可以跟我讨论,知无不答,谢谢大家。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !