?一、代碼示例
博主在日常工作中開展項(xiàng)目開發(fā),經(jīng)常遇到要將數(shù)據(jù)格式做轉(zhuǎn)換處理,比如一段字符串轉(zhuǎn)換為16進(jìn)制的byte數(shù)組、或者一段16進(jìn)制的byte數(shù)組轉(zhuǎn)換成字符串輸出等等。
現(xiàn)將這部分常見功能的實(shí)現(xiàn)分享給大家,希望對(duì)大家的學(xué)習(xí)和工作有所幫助。
//將一個(gè)雙字節(jié)(16位的數(shù)值)拆分為一個(gè)數(shù)組按字節(jié)存儲(chǔ) 如 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進(jìn)制串合并成其一半長度的二進(jìn)制串, 如 "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;
    }
}
//將二進(jìn)制源串分解成雙倍長度可讀的16進(jìn)制串, 如 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()函數(shù),并在目標(biāo)串后添一 '\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;
}
// 對(duì)一段字符串pszString填充前導(dǎo)字符ChAddChar,以便達(dá)到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);
}
// 刪除一個(gè)字符串pszString中的前導(dǎo)字符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++) );
    }
}
//以一個(gè)字符串str,以delim為分割符號(hào),分割成多個(gè)字符串,返回分割后的首地址
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;
    }
}
這幾個(gè)轉(zhuǎn)換函數(shù)都是很實(shí)用的基礎(chǔ)函數(shù),比如把一串字符串轉(zhuǎn)換為16進(jìn)制的數(shù)組,或者把一個(gè)16進(jìn)制的數(shù)組轉(zhuǎn)換為一個(gè)可顯示的字符串,在應(yīng)用程序中是一種很常見的數(shù)據(jù)轉(zhuǎn)換。
大家如對(duì)實(shí)現(xiàn)代碼有疑問,歡迎在評(píng)論席給我留言。 @_@ ...
?二、更多分享
架構(gòu)師李肯
架構(gòu)師李肯(全網(wǎng)同名),一個(gè)專注于嵌入式IoT領(lǐng)域的架構(gòu)師。有著近10年的嵌入式一線開發(fā)經(jīng)驗(yàn),深耕IoT領(lǐng)域多年,熟知IoT領(lǐng)域的業(yè)務(wù)發(fā)展,深度掌握IoT領(lǐng)域的相關(guān)技術(shù)棧,包括但不限于主流RTOS內(nèi)核的實(shí)現(xiàn)及其移植、硬件驅(qū)動(dòng)移植開發(fā)、網(wǎng)絡(luò)通訊協(xié)議開發(fā)、編譯構(gòu)建原理及其實(shí)現(xiàn)、底層匯編及編譯原理、編譯優(yōu)化及代碼重構(gòu)、主流IoT云平臺(tái)的對(duì)接、嵌入式IoT系統(tǒng)的架構(gòu)設(shè)計(jì)等等。擁有多項(xiàng)IoT領(lǐng)域的發(fā)明專利,熱衷于技術(shù)分享,有多年撰寫技術(shù)博客的經(jīng)驗(yàn)積累,連續(xù)多月獲得RT-Thread官方技術(shù)社區(qū)原創(chuàng)技術(shù)博文優(yōu)秀獎(jiǎng),榮獲CSDN博客專家、CSDN物聯(lián)網(wǎng)領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、2021年度CSDN&RT-Thread技術(shù)社區(qū)之星、2022年RT-Thread全球技術(shù)大會(huì)講師、RT-Thread官方嵌入式開源社區(qū)認(rèn)證專家、RT-Thread 2021年度論壇之星TOP4、華為云云享專家(嵌入式物聯(lián)網(wǎng)架構(gòu)設(shè)計(jì)師)等榮譽(yù)。堅(jiān)信【知識(shí)改變命運(yùn),技術(shù)改變世界】!
歡迎關(guān)注我的gitee倉庫01workstation ,日常分享一些開發(fā)筆記和項(xiàng)目實(shí)戰(zhàn),歡迎指正問題。
同時(shí)也非常歡迎關(guān)注我的CSDN主頁和專欄:
【CSDN主頁-架構(gòu)師李肯】
【RT-Thread主頁-架構(gòu)師李肯】
【GCC專欄】
【信息安全專欄】
【RT-Thread開發(fā)筆記】
【freeRTOS開發(fā)筆記】
	有問題的話,可以跟我討論,知無不答,謝謝大家。
	審核編輯:湯梓紅
- 
                                C語言
                                +關(guān)注
關(guān)注
183文章
7636瀏覽量
144293 - 
                                代碼
                                +關(guān)注
關(guān)注
30文章
4930瀏覽量
72801 - 
                                數(shù)組
                                +關(guān)注
關(guān)注
1文章
420瀏覽量
27069 
發(fā)布評(píng)論請(qǐng)先 登錄
ADC3561轉(zhuǎn)換成什么數(shù)據(jù)格式便于高速實(shí)時(shí)通過WIFI發(fā)送?
數(shù)據(jù)格式不同,如何在轉(zhuǎn)換求均值
怎么實(shí)現(xiàn)FPGA的新型數(shù)據(jù)格式轉(zhuǎn)換?
如何實(shí)現(xiàn)新型數(shù)據(jù)格式轉(zhuǎn)換?
如何實(shí)現(xiàn)規(guī)定數(shù)據(jù)格式的不定長數(shù)據(jù)的接收?
前處理時(shí)圖片數(shù)據(jù)格式轉(zhuǎn)換需要HWC轉(zhuǎn)CHW和NCHW, 1684是否相關(guān)接口可以使用?
數(shù)據(jù)格式,計(jì)算機(jī)中數(shù)據(jù)格式詳細(xì)介紹
新型數(shù)據(jù)格式轉(zhuǎn)換的FPGA實(shí)現(xiàn)
    
gps數(shù)據(jù)格式含義說明
C語言 | 用51單片機(jī)實(shí)現(xiàn)公歷與農(nóng)歷星期的轉(zhuǎn)換(完整源代碼)
    
MDB-RS232適配器數(shù)據(jù)格式分析
一個(gè)工具搞定標(biāo)注數(shù)據(jù)格式轉(zhuǎn)換
    
          
        
        
【C語言進(jìn)階】常見數(shù)據(jù)格式轉(zhuǎn)換處理的代碼實(shí)現(xiàn)
                
 
    
           
            
            
                
            
評(píng)論