女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

char數組轉16進制HEX串

GReq_mcu168 ? 來源:玩轉單片機 ? 2020-08-04 16:53 ? 次閱讀

緣由


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

char數組轉16進制HEX串


例子:
將如下的量

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

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

constcharhex_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]; }} 完整測試代碼如下:

#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;} 輸出結果:31323334

16進制HEX串轉成數值數組


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

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;}? 輸出結果:okok

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17864

    瀏覽量

    360929
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70296
  • 16進制
    +關注

    關注

    1

    文章

    13

    瀏覽量

    8931

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    ASCII十六進制

    UDP通訊輸出數據是ASCII,用強制類型轉換會丟數值,48字節不全,請問有沒有大佬有好的方法把ASCII轉成16進制數啊?
    發表于 02-18 11:42

    字符與字符數組的區別

    在編程語言中,字符和字符數組是兩種基本的數據結構,它們都用于存儲和處理文本數據。盡管它們在功能上有一定的重疊,但在內部表示、操作方式和使用場景上存在顯著差異。 1. 內部表示 字符 字符
    的頭像 發表于 01-07 15:29 ?1010次閱讀

    數組的下標為什么可以是負數

    最近有同學發來這樣一段代碼,并提出一個問題,數組的下標為什么可以是負數? ? ? #include int main(){ const char *s = "helloworld"; const
    的頭像 發表于 12-20 11:18 ?451次閱讀

    指針數組和二維數組有沒有區別

    指針數組和二維數組有沒有區別?比如這樣的兩個代碼。 int main(){ char *s1[] = { "hello", "world", "total" }; char s2[][
    的頭像 發表于 11-24 11:12 ?491次閱讀

    hex格式和二進制的區別

    HEX格式和二進制在多個方面存在顯著的區別。以下是對這兩者的對比: 一、定義與表示方式 HEX格式 : HEX,全稱為Intel HEX,是
    的頭像 發表于 11-18 15:24 ?1557次閱讀

    base64字符轉換為二進制文件

    Base64是一種編碼方法,用于將二進制數據轉換為ASCII字符。這種編碼通常用于在不支持二進制數據的系統中傳輸數據,例如電子郵件或網頁。將Base64字符轉換為二
    的頭像 發表于 11-10 10:55 ?2678次閱讀

    labview中浮點數與十六進制字符相互轉化

    與下位機數據交流及通訊時,經常有浮點數與十六進制字符相互轉化的需求,經過兩天總結,找到了最簡潔的相互轉化的方法,萌新歡迎大佬指正,文件也附上。*附件:HEX字符與浮點數轉換.rar
    發表于 10-21 19:51

    FT232芯片設計的USBRS232口原理圖

    FT232芯片設計的USBRS232口原理圖
    發表于 10-21 11:06 ?11次下載

    進制數據十六進制字符_ASCII碼

    進制數據十六進制字符_ASCII碼
    發表于 09-18 10:17 ?1次下載

    labview字符數組轉化為數值數組

    在LabVIEW中,將字符數組轉換為數值數組是一項常見的任務,尤其是在處理數據采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數據類型 在開始之前,了解LabVIEW中的數據類型是非
    的頭像 發表于 09-04 17:47 ?5000次閱讀

    labview字符如何轉換為16進制字符

    在LabVIEW中,將字符轉換為16進制字符是一個常見的需求,尤其是在處理數據通信和硬件接口時。LabVIEW提供了多種方法來實現這一
    的頭像 發表于 09-04 15:54 ?4768次閱讀

    hex文件如何查看原c語言代碼

    直接將 .hex 文件轉換回原始的 C 語言代碼是不可能的,因為 .hex 文件是二進制文件,它包含了單片機程序編譯后的機器碼,這些機器碼與原始的 C 語言代碼在結構和表達上存在巨大的差異。機器碼
    的頭像 發表于 09-02 10:37 ?4502次閱讀

    將格式化數據存儲到char數組的最簡單方法是什么?

    os_printf將文本格式化為 UART 輸出的函數。 將格式化數據存儲到 char 數組的最簡單方法是什么?
    發表于 07-11 08:01

    請問esp32如何將16進制字符轉換成base64格式?

    請問 esp32 如何將 16進制字符轉換成base64格式
    發表于 06-24 08:35

    esp32中如何將16進制的數據轉換成字符

    想將16進制的數原數轉換成字符,但不知道怎么轉換??百度查的不成功
    發表于 06-19 07:37