精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    16992

    瀏覽量

    350317
  • 代碼
    +關注

    關注

    30

    文章

    4748

    瀏覽量

    68356
  • 16進制
    +關注

    關注

    1

    文章

    13

    瀏覽量

    8761

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    hex格式和二進制的區別

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

    base64字符轉換為二進制文件

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

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

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

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

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

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

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

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

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

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

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

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

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

    深入探索KUKA KRL中的數組應用

    如果 CHAR 類型數組的所有數組元素都擁有相同的字符,則不必單獨初始化每個數組元素。忽略右側的數組
    的頭像 發表于 04-18 10:37 ?1131次閱讀
    深入探索KUKA KRL中的<b class='flag-5'>數組</b>應用

    stm32f030口接收到數組如何處理?

    stm32f030口接收到八個字節數組,我想提取這個數組的第4位和第5位來進行運算后轉為十進制數,但是提取數據的時候出問題了,本人剛入門小白,求大佬指點 下面是我中斷的代碼:
    發表于 03-29 06:11

    鴻蒙二進制數組創建

    napi_create_arraybuffer: 這個接口只能創建空的二進制數組,沒辦法把char的內容丟進去創建 napi_create_external_arraybuffer: 這個接口支持創建二
    的頭像 發表于 01-31 15:24 ?1218次閱讀

    labview二進制字符轉數值

    字符是一種常見的數據類型,它表示了以二進制形式存儲的數據。當我們需要將這些二進制字符轉換為數值時,LabVIEW提供了一些常用的函數和方法,可以幫助我們完成這個任務。 首先,我們需
    的頭像 發表于 01-05 16:20 ?2474次閱讀

    oracle中to_char用法

    、日期、時間戳或者其他可以轉為字符類型的數據。格式模型是一個用來定義輸出格式的字符,用于指定函數的返回結果應該是什么樣的。 下面我會詳細介紹to_char函數的使用方法和一些常見的格式模型。 數值字符 當將數值類型的數據轉為
    的頭像 發表于 12-05 16:54 ?2192次閱讀

    字符數組和字符有沒有區別?

    字符數組和字符有沒有區別?
    的頭像 發表于 11-30 16:39 ?624次閱讀