?一、代碼示例
博主在日常工作中開展項目開發,經常遇到要將數據格式做轉換處理,比如一段字符串轉換為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主頁-架構師李肯】
【GCC專欄】
【信息安全專欄】
【RT-Thread開發筆記】
【freeRTOS開發筆記】
有問題的話,可以跟我討論,知無不答,謝謝大家。
審核編輯:湯梓紅
-
C語言
+關注
關注
180文章
7614瀏覽量
137747 -
代碼
+關注
關注
30文章
4829瀏覽量
69068 -
數組
+關注
關注
1文章
417瀏覽量
26031
發布評論請先 登錄
相關推薦
ADC3561轉換成什么數據格式便于高速實時通過WIFI發送?
數據格式不同,如何在轉換求均值
怎么實現FPGA的新型數據格式轉換?
如何實現新型數據格式轉換?
前處理時圖片數據格式轉換需要HWC轉CHW和NCHW, 1684是否相關接口可以使用?
新型數據格式轉換的FPGA實現
![新型<b class='flag-5'>數據格式</b><b class='flag-5'>轉換</b>的FPGA<b class='flag-5'>實現</b>](https://file1.elecfans.com//web2/M00/A6/12/wKgZomUMO5eACf8aAAAMQWi1aNs063.jpg)
MDB-RS232適配器數據格式分析
一個工具搞定標注數據格式轉換
![一個工具搞定標注<b class='flag-5'>數據格式</b><b class='flag-5'>轉換</b>](https://file1.elecfans.com/web2/M00/89/98/wKgaomSIMH2AeDU0AABdABNei5w742.png)
評論