色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

GReq_mcu168 ? 來源:玩轉(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í)很簡單,追求速度的話,查表就好了
從0-16對應(yīng)0-F即可:

constcharhex_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 然后一個(gè)個(gè)從表里取出來,拼到對應(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進(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對應(yīng)了0x30-0x39
ASCII中的A-F對應(yīng)了0x41-0x46
ASCII中的a-f對應(yīng)了0x61-0x66
也就是說,只要這一個(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--; }}? 完整的測試代碼

#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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17316

    瀏覽量

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

    關(guān)注

    30

    文章

    4823

    瀏覽量

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

    關(guān)注

    1

    文章

    13

    瀏覽量

    8801

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

    進(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 ?0次下載

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

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

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

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

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

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

    請問esp32如何將16進(jìn)制字符轉(zhuǎn)換成base64格式?

    請問 esp32 如何將 16進(jìn)制字符轉(zhuǎn)換成base64格式
    發(fā)表于 06-24 08:35

    esp32中如何將16進(jìn)制的數(shù)據(jù)轉(zhuǎn)換成字符

    想將16進(jìn)制的數(shù)原數(shù)轉(zhuǎn)換成字符,但不知道怎么轉(zhuǎn)換??百度查的轉(zhuǎn)不成功
    發(fā)表于 06-19 07:37

    深入探索KUKA KRL中的數(shù)組應(yīng)用

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

    stm32f030口接收到數(shù)組如何處理?

    stm32f030口接收到八個(gè)字節(jié)數(shù)組,我想提取這個(gè)數(shù)組的第4位和第5位來進(jìn)行運(yùn)算后轉(zhuǎn)為十進(jìn)制數(shù),但是提取數(shù)據(jù)的時(shí)候出問題了,本人剛?cè)腴T小白,求大佬指點(diǎn) 下面是我中斷的代碼:
    發(fā)表于 03-29 06:11

    鴻蒙二進(jìn)制數(shù)組創(chuàng)建

    napi_create_arraybuffer: 這個(gè)接口只能創(chuàng)建空的二進(jìn)制數(shù)組,沒辦法把char的內(nèi)容丟進(jìn)去創(chuàng)建 napi_create_external_arraybuffer: 這個(gè)接口支持創(chuàng)建二
    的頭像 發(fā)表于 01-31 15:24 ?1318次閱讀
    主站蜘蛛池模板: 久久亚洲AV无码精品午色夜麻豆 | 国产欧洲野花A级 | 爱穿丝袜的麻麻3d漫画免费 | 脱女学小内内摸出水网站免费 | 色婷婷粉嫩AV精品综合在线 | 日韩欧美中文字幕在线二视频 | 又紧又大又爽精品一区二区 | 波多野结衣 无码片 | 506070老熟肥妇bbwxx视频 4虎最新网址 | 为什么丈夫插我我却喜欢被打着插 | 2021国产精品视频一区 | 色婷婷亚洲精品天天综合影院 | 乌克兰少妇大胆大BBW | 青春草久久| 亚在线观看免费视频入口 | 亚洲综合日韩在线2019 | 月夜直播免费看 | 欧洲精品一区二区不卡观看 | 羽月希被黑人吃奶dasd585 | 热热久久超碰精品中文字幕 | 高清 仑乱 一级 a | 色狐直播免费观看 | 伊人久久亚洲精品一区 | 秋霞午夜一级理论片久久 | 骚浪插深些好烫喷了 | 91进入蜜桃臀在线播放 | 黄桃AV无码免费一区二区三区 | 国产网红主播精品福利大秀专区 | 亚洲精品九色在线网站 | 在线中文字幕视频 | 国产真实强被迫伦姧女在线观看 | 国产精品久久国产三级国不卡顿 | 91精品专区 | 国产亚洲精品久久久久久无码网站 | 综合伊人久久 | 美女露出撒尿的部位 | 国内精品伊人久久久久 | 午夜宅宅伦电影网中文字幕 | 啊灬啊别停灬用力啊在线观看视频 | 日韩精品久久久久影院 | 综合人妻久久一区二区精品 |