0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【C语言进阶】常见数据格式转换处理的代码实现

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-08-17 08:48 次阅读

​一、代码示例

博主在日常工作中开展项目开发,经常遇到要将数据格式做转换处理,比如一段字符串转换为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开发笔记】

有问题的话,可以跟我讨论,知无不答,谢谢大家。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136680
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68518
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25939
收藏 人收藏

    评论

    相关推荐

    ADC3561转换成什么数据格式便于高速实时通过WIFI发送?

    5MHz的16位采样率,LVDS格式数据输出,使用串口转WIFI模块受限于串口波特率无法实现实时发送,请问转换成什么数据格式便于高速实时
    发表于 11-18 08:06

    数据格式不同,如何在转换求均值

    在图1中,可读取wav格式的文件,亦可播放,在后续的求均值中便会出错,是否因为数据格式不对?或者是wav格式的文件用不用先用MATLAB转成txt的数据然后再求,如果是那样的话还能播放
    发表于 03-10 10:19

    怎么实现FPGA的新型数据格式转换

    运算作为数字信号处理中最常见的运算之一,各大EDA软件都带有免费的浮点运算IP核。通过对IP核的生成和例化来实现浮点运算,把FPGA设计者从繁重的代码编写中解脱了出来,同时可以对IP核
    发表于 08-29 06:50

    如何实现新型数据格式转换

    浮点运算作为数字信号处理中最常见的运算之一,各大EDA软件都带有免费的浮点运算IP核。通过对IP核的生成和例化来实现浮点运算,把FPGA设计者从繁重的代码编写中解脱了出来,同时可以对I
    发表于 10-12 06:19

    如何实现规定数据格式的不定长数据的接收?

    如何实现规定数据格式的不定长数据的接收?
    发表于 12-09 07:48

    处理时图片数据格式转换需要HWC转CHW和NCHW, 1684是否相关接口可以使用?

    处理时图片数据格式转换需要HWC转CHW和NCHW, 1684是否相关接口可以使用?
    发表于 09-19 06:41

    数据格式,计算机中数据格式详细介绍

    数据格式,计算机中数据格式详细介绍    计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式
    发表于 04-13 11:36 3676次阅读

    新型数据格式转换的FPGA实现

    提出了一种数据格式转换方法。使用VHDL语言,采用流水线处理方式将ASCII码所表示的一定范围内的实数转换为单精度浮点数。
    发表于 11-18 15:39 832次阅读
    新型<b class='flag-5'>数据格式</b><b class='flag-5'>转换</b>的FPGA<b class='flag-5'>实现</b>

    gps数据格式含义说明

    本内容介绍了gps数据格式的含义,给出了GPS输出的是NMEA-0183的数据格式,GPS固定数据输出语句($GPGGA)
    发表于 12-19 14:57 1.3w次阅读

    CoolFormat3.2C语言代码格式化工具

    CoolFormat3.2,将C语言代码格式化的工具。
    发表于 05-20 17:01 20次下载

    C语言 | 用51单片机实现公历与农历星期的转换(完整源代码

    C语言 | 用51单片机实现公历与农历星期的转换(完整源代码
    发表于 11-21 11:36 48次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b> | 用51单片机<b class='flag-5'>实现</b>公历与农历星期的<b class='flag-5'>转换</b>(完整源<b class='flag-5'>代码</b>)

    MDB-RS232适配器数据格式分析

    MDB-RS232适配器数据格式分析。让用户能够很容易理解发送和接收的数据格式。快速实现MDB接口的纸币器,硬币器和非现金支付刷卡器的数据解析。
    发表于 04-27 15:50 7次下载

    C语言进阶C语言指针的高阶用法

    C语言进阶C语言指针的高阶用法
    的头像 发表于 08-31 13:24 2317次阅读

    串口通讯的基本概念、数据格式

    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。
    的头像 发表于 04-23 11:13 5483次阅读
    串口通讯的基本概念、<b class='flag-5'>数据格式</b>

    一个工具搞定标注数据格式转换

    Datumaro 是支持命令行调用的模式,因此我们可以非常方便地使用 1 行命令完成 2 种不同格式数据转换,下面我将基于命令行模式,演示一下 Datumaro 处理标注
    的头像 发表于 06-13 17:00 1003次阅读
    一个工具搞定标注<b class='flag-5'>数据格式</b><b class='flag-5'>转换</b>