chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

緣由


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

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


例子:
將如下的量

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

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

constcharhex_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 然后一個(gè)個(gè)從表里取出來(lái),拼到對(duì)應(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]; }} 完整測(cè)試代碼如下:

#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進(jìn)制HEX串轉(zhuǎn)成數(shù)值數(shù)組


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

#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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17970

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70680
  • 16進(jìn)制
    +關(guān)注

    關(guān)注

    1

    文章

    13

    瀏覽量

    8955

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    電子發(fā)燒友網(wǎng)為你提供()300 kHz 至 2.0 GHz 5 位數(shù)字衰減器,帶轉(zhuǎn)并行驅(qū)動(dòng)器相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有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ū)動(dòng)器 skyworksinc

    ASCII轉(zhuǎn)十六進(jìn)制數(shù)

    UDP通訊輸出數(shù)據(jù)是ASCII,用強(qiáng)制類型轉(zhuǎn)換會(huì)丟數(shù)值,48字節(jié)轉(zhuǎn)不全,請(qǐng)問(wèn)有沒(méi)有大佬有好的方法把ASCII轉(zhuǎn)成16進(jìn)制數(shù)啊?
    發(fā)表于 02-18 11:42

    字符與字符數(shù)組的區(qū)別

    在編程語(yǔ)言中,字符和字符數(shù)組是兩種基本的數(shù)據(jù)結(jié)構(gòu),它們都用于存儲(chǔ)和處理文本數(shù)據(jù)。盡管它們?cè)诠δ苌嫌幸欢ǖ闹丿B,但在內(nèi)部表示、操作方式和使用場(chǎng)景上存在顯著差異。 1. 內(nèi)部表示 字符 字符
    的頭像 發(fā)表于 01-07 15:29 ?1136次閱讀

    數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)

    最近有同學(xué)發(fā)來(lái)這樣一段代碼,并提出一個(gè)問(wèn)題,數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)? ? ? #include int main(){ const char *s = "helloworld"; const
    的頭像 發(fā)表于 12-20 11:18 ?493次閱讀

    數(shù)組名之間可以直接賦值嗎

    ; ????return 0;} 想把數(shù)組 a 里面的數(shù)據(jù)全部賦值給 b,寫成 b = a 行不行? 和這個(gè)問(wèn)題類似的還有,數(shù)組名為什么不能進(jìn)行 ++ 操作? char?array[5]?=?{0};array++; 比如
    的頭像 發(fā)表于 11-26 11:23 ?623次閱讀

    指針數(shù)組和二維數(shù)組有沒(méi)有區(qū)別

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

    hex格式和二進(jìn)制的區(qū)別

    HEX格式和二進(jìn)制在多個(gè)方面存在顯著的區(qū)別。以下是對(duì)這兩者的對(duì)比: 一、定義與表示方式 HEX格式 : HEX,全稱為Intel HEX,是
    的頭像 發(fā)表于 11-18 15:24 ?1720次閱讀

    base64字符轉(zhuǎn)換為二進(jìn)制文件

    Base64是一種編碼方法,用于將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為ASCII字符。這種編碼通常用于在不支持二進(jìn)制數(shù)據(jù)的系統(tǒng)中傳輸數(shù)據(jù),例如電子郵件或網(wǎng)頁(yè)。將Base64字符轉(zhuǎn)換為二
    的頭像 發(fā)表于 11-10 10:55 ?2826次閱讀

    labview中浮點(diǎn)數(shù)與十六進(jìn)制字符相互轉(zhuǎn)化

    與下位機(jī)數(shù)據(jù)交流及通訊時(shí),經(jīng)常有浮點(diǎn)數(shù)與十六進(jìn)制字符相互轉(zhuǎn)化的需求,經(jīng)過(guò)兩天總結(jié),找到了最簡(jiǎn)潔的相互轉(zhuǎn)化的方法,萌新歡迎大佬指正,文件也附上。*附件:HEX字符與浮點(diǎn)數(shù)轉(zhuǎn)換.rar
    發(fā)表于 10-21 19:51

    FT232芯片設(shè)計(jì)的USB轉(zhuǎn)RS232口原理圖

    FT232芯片設(shè)計(jì)的USB轉(zhuǎn)RS232口原理圖
    發(fā)表于 10-21 11:06 ?13次下載

    Labview對(duì)串口的16進(jìn)制通信?

    各位大佬,寫了一個(gè)Labview的步進(jìn)電機(jī)控制程序,使用VISA進(jìn)行通訊,為什么結(jié)果顯示發(fā)送了數(shù)據(jù)電機(jī)還是沒(méi)有反應(yīng),可以幫忙看看嗎?使用串口助手進(jìn)行16進(jìn)制發(fā)送電機(jī)能正常響應(yīng),Labview給虛擬串口發(fā)送的消息也和串口助手發(fā)送的數(shù)據(jù)一樣沒(méi)問(wèn)題。
    發(fā)表于 10-11 19:57

    進(jìn)制數(shù)據(jù)轉(zhuǎn)十六進(jìn)制字符_轉(zhuǎn)ASCII碼

    進(jìn)制數(shù)據(jù)轉(zhuǎn)十六進(jìn)制字符_轉(zhuǎn)ASCII碼
    發(fā)表于 09-18 10:17 ?1次下載

    labview字符數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組

    在LabVIEW中,將字符數(shù)組轉(zhuǎn)換為數(shù)值數(shù)組是一項(xiàng)常見(jiàn)的任務(wù),尤其是在處理數(shù)據(jù)采集、信號(hào)處理或用戶輸入時(shí)。 1. 理解LabVIEW的數(shù)據(jù)類型 在開(kāi)始之前,了解LabVIEW中的數(shù)據(jù)類型是非
    的頭像 發(fā)表于 09-04 17:47 ?5602次閱讀

    labview字符如何轉(zhuǎn)換為16進(jìn)制字符

    在LabVIEW中,將字符轉(zhuǎn)換為16進(jìn)制字符是一個(gè)常見(jiàn)的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時(shí)。LabVIEW提供了多種方法來(lái)實(shí)現(xiàn)這一轉(zhuǎn)
    的頭像 發(fā)表于 09-04 15:54 ?5264次閱讀

    hex文件如何查看原c語(yǔ)言代碼

    直接將 .hex 文件轉(zhuǎn)換回原始的 C 語(yǔ)言代碼是不可能的,因?yàn)?.hex 文件是二進(jìn)制文件,它包含了單片機(jī)程序編譯后的機(jī)器碼,這些機(jī)器碼與原始的 C 語(yǔ)言代碼在結(jié)構(gòu)和表達(dá)上存在巨大的差異。機(jī)器碼
    的頭像 發(fā)表于 09-02 10:37 ?4909次閱讀