国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

char數(shù)組轉(zhuǎn)16進制HEX串

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機 ? 2020-08-04 16:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

緣由


這個起因是昨晚群里有人在討論怎么把字符串轉(zhuǎn)成HEX方法最佳,討論到最后變成哪種方法效率最優(yōu)了。畢竟這代碼是要在MCU上面跑的,要同時考慮到時間和空間的最優(yōu)解。
當(dāng)然討論的是有結(jié)果的,具體實現(xiàn)的方法和代碼在下面展示。

char數(shù)組轉(zhuǎn)16進制HEX串


例子:
將如下的量

char str[] = "12345";char data[] = {1,2,3,4,5,0xff}; 轉(zhuǎn)成

"313233343500""0102030405FF" 這樣的結(jié)果
這個其實很簡單,追求速度的話,查表就好了
從0-16對應(yīng)0-F即可:

constcharhex_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 然后一個個從表里取出來,拼到對應(yīng)位置即可:

void to_hex(char *s, int l, char *d){ while(l--) { *(d+2*l+1) = hex_table[(*(s+l))&0x0f]; *(d+2*l) = hex_table[(*(s+l))>>4]; }} 完整測試代碼如下:

#include const char hex_table[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};void to_hex(char *s, int l, char *d){ while(l--) { *(d+2*l+1) = hex_table[(*(s+l))&0x0f]; *(d+2*l) = hex_table[(*(s+l))>>4]; }}int main () { char s[]= "1234"; char d[9]; d[8] = ''; to_hex(s,4,d); printf("%s",d); return 0;} 輸出結(jié)果:31323334

16進制HEX串轉(zhuǎn)成數(shù)值數(shù)組


例子:
將類似"AAbb2fFF"的量轉(zhuǎn)成{0xAA,0xBB,0x2F,0xff}這樣的結(jié)果
這里如果還用查表的話,這個rom占用會浪費掉不少空間,所有查表法直接就被否決掉了(如果是PC上,追求極致速度的話,當(dāng)然可以用)。
同時,為了通用性,代碼需要兼容大小寫兩種輸入數(shù)據(jù)
在仔細研究數(shù)據(jù)的結(jié)構(gòu)時,我發(fā)現(xiàn)了個規(guī)律:
ASCII中的0-9對應(yīng)了0x30-0x39
ASCII中的A-F對應(yīng)了0x41-0x46
ASCII中的a-f對應(yīng)了0x61-0x66
也就是說,只要這一個字符大于0x39,那它一定是字母;同時,在上面的分析也可以發(fā)現(xiàn),如果這個字符是字母,不論大寫小寫,只需要看低四位就可以直接判斷這個字符代表的數(shù)是多少
具體邏輯如下:
判斷這個字符是否大于0x39
如果不是,直接取這個字符的低四位當(dāng)作結(jié)果
如果是,則為字母,將他的低四位加上9即為所需結(jié)果
具體實現(xiàn)代碼也如下:

void from_hex(char *s, int l, char *d){ while(l--) { char* p = s+l; char* p2 = p-1; *(d+l/2) = ( (*p>'9'? *p+9 : *p) & 0x0f ) | ( (*p2>'9'? *p2+9 : *p2) << 4 ); l--; }}? 完整的測試代碼

#include void from_hex(char *s, int l, char *d){ while(l--) { char* p = s+l; char* p2 = p-1; *(d+l/2) = ( (*p>'9'? *p+9 : *p) & 0x0f ) | ( (*p2>'9'? *p2+9 : *p2) << 4 ); l--; }}int main () { char s[]= "6F6B6f6b"; char d[5]; d[4] = ''; from_hex(s,8,d); printf("%s",d); return 0;}? 輸出結(jié)果:okok

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18925

    瀏覽量

    398178
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73970
  • 16進制
    +關(guān)注

    關(guān)注

    1

    文章

    13

    瀏覽量

    9107

原文標(biāo)題:太巧妙了!適合 MCU 用的 C語言 快速互轉(zhuǎn) HEX (16進制) 方法!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    ARDUINO串口收發(fā)16進制

    大家好,本人菜鳥剛學(xué),請大家給與幫助。我用串口助手向我的設(shè)備發(fā)送16進制碼讀取溫度濕度值,發(fā)送命令55 1B 02 00 02 0E 08 E8 55 1B 02 00 02 0E 08 E8,接收
    發(fā)表于 01-18 17:27

    C語言常用的轉(zhuǎn)換函數(shù)實現(xiàn)原理

    編程時,經(jīng)常用到進制轉(zhuǎn)換、字符轉(zhuǎn)換。比如軟件界面輸入的數(shù)字字符,如何將字符處理成數(shù)字呢?今天就和大家分享一下。 字符轉(zhuǎn)十六
    發(fā)表于 01-06 08:30

    分享幾個實用的嵌入式 C程序!

    和精力。 所以想在這里統(tǒng)一記錄一下,以備下次重新使用。代碼以實用為主,如果缺陷,歡迎指出。 1、十六進制字符轉(zhuǎn)整型數(shù)字 功能:將16進制的字符
    發(fā)表于 01-04 08:37

    深入剖析DS92LV1616位總線LVDS串行器/解器的卓越性能與應(yīng)用

    深入剖析DS92LV1616位總線LVDS串行器/解器的卓越性能與應(yīng)用 在當(dāng)今高速數(shù)據(jù)傳輸?shù)臅r代,串行器/解器(SERDES)在數(shù)據(jù)處理和傳輸中扮演著至關(guān)重要的角色。德州儀器(T
    的頭像 發(fā)表于 12-31 14:45 ?365次閱讀

    matlab2024a啟動自運行文檔無效

    打算命令行啟動自動配置為16進制模式,于是startup.m文件中,添加format hex。重啟后,發(fā)現(xiàn)命令行還是10進制模式。
    發(fā)表于 12-30 10:03

    字符關(guān)聯(lián)數(shù)字變量如何使用?我們的地址都是16位數(shù)據(jù),可以使用16位數(shù)字變量顯示字符嗎?

    字符關(guān)聯(lián)數(shù)字變量如何使用?我們的地址都是16位數(shù)據(jù),可以使用16位數(shù)字變量顯示字符嗎?
    發(fā)表于 12-15 08:24

    進制查找(Binary Search)介紹

    進制查找(Binary Search)用于在已排序的數(shù)組中執(zhí)行二進制查找的函數(shù)。 int binary_search(int arr[], int size, int target
    發(fā)表于 12-12 06:54

    對UART0輸入到串口的char型數(shù)據(jù)轉(zhuǎn)換成16進制的寄存器常用int型相關(guān)處理

    ascii碼了,比如輸入0,但接收到轉(zhuǎn)換成int型后顯示的卻是48,輸入a顯示的是97。 為了方便硬件寄存器得到想要的16進制數(shù)據(jù),我們先要將char型轉(zhuǎn)換成int型。 利用如圖所示代碼,即可
    發(fā)表于 10-31 07:58

    3-16一顆芯片搞定 全解AMG8816全集成BMS主控的參數(shù)真相

    3-16一顆芯片搞定”——全解AMG8816全集成BMS主控的參數(shù)真相 在 電動兩輪車、園林工具和儲能小型Pack 日趨精簡化的今天,一顆“能干事”的電池管理芯片(BMS主控)正成為系統(tǒng)設(shè)計的關(guān)鍵
    的頭像 發(fā)表于 07-30 16:38 ?1933次閱讀
    3-<b class='flag-5'>16</b><b class='flag-5'>串</b>一顆芯片搞定 全解AMG8816全集成BMS主控的參數(shù)真相

    Analog Devices / Maxim Integrated MAX96717 CSI-2轉(zhuǎn)GMSL?2行器數(shù)據(jù)手冊

    Analog Devices MAX96717 CSI-2轉(zhuǎn)GMSL?2行器接受4路MIPI CSI-2接口上的視頻,然后在GMSL2行鏈路收發(fā)器上輸出,通過同軸電纜傳輸。同時,該器件通過同一
    的頭像 發(fā)表于 06-17 14:02 ?1221次閱讀
    Analog Devices / Maxim Integrated MAX96717 CSI-2<b class='flag-5'>轉(zhuǎn)</b>GMSL?2<b class='flag-5'>串</b>行器數(shù)據(jù)手冊

    300 kHz 至 2.0 GHz 5 位數(shù)字衰減器,帶轉(zhuǎn)并行驅(qū)動器 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()300 kHz 至 2.0 GHz 5 位數(shù)字衰減器,帶轉(zhuǎn)并行驅(qū)動器相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊,更有300 kHz 至 2.0 GHz 5 位數(shù)字衰減器,帶轉(zhuǎn)
    發(fā)表于 05-26 18:30
    300 kHz 至 2.0 GHz 5 位數(shù)字衰減器,帶<b class='flag-5'>串</b><b class='flag-5'>轉(zhuǎn)</b>并行驅(qū)動器 skyworksinc

    0.7-4.0 GHz 五位數(shù)字衰減器,帶轉(zhuǎn)并行驅(qū)動器 (0.5 dB LSB) skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()0.7-4.0 GHz 五位數(shù)字衰減器,帶轉(zhuǎn)并行驅(qū)動器 (0.5 dB LSB)相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊,更有0.7-4.0 GHz 五位數(shù)字衰減器,帶轉(zhuǎn)并行
    發(fā)表于 05-23 18:31
    0.7-4.0 GHz 五位數(shù)字衰減器,帶<b class='flag-5'>串</b><b class='flag-5'>轉(zhuǎn)</b>并行驅(qū)動器 (0.5 dB LSB) skyworksinc

    用TXT編輯器打開十六進制文件,如何知道校驗和值?

    我從客戶那邊得到了一個 pmg1-s3 十六進制文件,我想把它和校驗和提供給集成電路編程工廠。 1.用 TXT 編輯器打開十六進制文件,如何知道校驗和值? 附帶的是十六進制文件。 2. 另一個問題是
    發(fā)表于 05-23 07:49

    itop-3568開發(fā)板驅(qū)動開發(fā)指南-實驗程序的編寫

    數(shù)組 6、static char str1[10];//定義 char 類型字符 str1 7、static int n_para;//定義 int 類型的用來記錄
    發(fā)表于 05-19 10:26

    請問如何燒錄多個十六進制文件?

    當(dāng)我使用 S32DS 程序加載時,所有十六進制文件都是通過使用這些命令執(zhí)行一次擦除來加載的,但是當(dāng)我通過使用 CMD 打開服務(wù)器和客戶端來加載時,所有十六進制文件中的所有內(nèi)容都會被擦除命令擦除
    發(fā)表于 03-27 06:59