① c語言編程 把十進制轉換為十六進制
方法一:
#include<iostream>
#include <string>
using namespace std;
string DecIntToHexStr(long long num)
{ string str; long long Temp = num / 16; int left = num % 16; if (Temp > 0) str +=
DecIntToHexStr(Temp); if (left < 10) str += (left + '0'); else str += ('A' + left - 10); return str;}
string DecStrToHexStr(string str){ long long Dec = 0; for (int i = 0; i < str.size(); ++i) Dec =
Dec * 10 + str[i] - '0'; return DecIntToHexStr(Dec);}int main()
{ string DecStr; while (cin >> DecStr) { cout << "0x" + DecStrToHexStr(DecStr); } return 0;}
方法二:
#include<iostream>
#include <string>
#include<vector>
#include <sstream>
#include <math.h>
using namespace std;int main()
{ string decStr; cin >> decStr; int num = stoi(decStr); vector<int>v; while (num) { int bit = num % 2; v.push_back(bit); num = num / 2; }
reverse(v.begin(), v.end()); string hexStr; if (v.size() % 4 == 0) { for (int i = 0; i < v.size() / 4; ++i) { int temp = 0, k = 3; for (int j = i * 4; j < (i +
1) * 4; ++j) { if (v[j] == 1) temp += pow(2, k); --k; } if (temp <= 9) hexStr += temp; else hexStr += ('A' + temp - 10); } }
else { int zeroNum = 4 - v.size() % 4; for (int i = 0; i < zeroNum; ++i) v.insert(v.begin(), 0); for (int i = 0; i < v.size() / 4; ++i) { int temp = 0, k = 3; for
(int j = i * 4; j < (i + 1) * 4; ++j) { if (v[j] == 1) temp += pow(2, k); --k; }
if (temp <= 9) { stringstream ss; string strTemp;
ss << temp; ss >> strTemp; hexStr += strTemp; } else hexStr += ('A' + temp - 10); } } cout << hexStr << endl; return 0;}
(1)c語言單片機程序轉HEX擴展閱讀:
還有3種方式可以實現,其中兩種是使用系統函數,另一種是直接自己編寫。
下面的代碼就是3種方式的實現,包括2位的整數和任意整數(2的31次方以內)都可以。可自己選擇需要的實現方式。
利用系統函數有
1. char * itoa ( int value, char * str, int base );value是要轉化的數字,str是轉化後的字元串存儲的位置,base是進制數(但是這個函數不是標准C函數,有些編譯器是不支持的!)。所以代碼可以為:
char buffer [33]; //用於存放轉換好的十六進制字元串,可根據需要定義長度 char * inttohex(int aa){ itoa (aa, buffer, 16); return (buffer);}
2. sprintf(str,"%x",value);str是轉化存儲的位置,%x表示十六進制格式,value是要轉化的數字。所以代碼可以為:
char buffer [33]; //用於存放轉換好的十六進制字元串,可根據需要定義長度 char * inttohex(int aa){ sprintf(buffer, "%x", aa); return (buffer);}
3. 自己編寫
如果參數只要兩位數的整數,那麼很簡單。
代碼如下:
#include <stdio.h>#include <stdlib.h> char buffer [33]; //用於存放轉換好的十六進制字元串,可根據需要定義長度 char * inttohex(int aa)
{ sprintf(buffer, "%x", aa); return (buffer);} int main ()
{ int num; char * hex_str; printf ("Enter a number: "); scanf ("%d",&num); hex_str = inttohex (num); printf ("Hexadecimal number: %sH ", hex_str); return 0;}
② 如何把這個C語言文件轉化為hex文件
可以配置他是否顯示頭文件,工程目錄樹是怎麼組織的等等信息
10 bak就是對工程文件的備份.LST 列表文件,被定位到單片機哪個地址里了,例如你有哪些代碼段,顯示程序匯編後的匯編代碼等等,顯示符號表.OBJ 這個是編譯器編譯後的最終文件:
1 test1 無後綴文件,沒有調用哪個函數,裡面都是連接器的連接信息,沒啥說的
呀.hex 這個文件可以直接下載到單片機里,然後提取變成HEX
6 DBK PWI 是test1,共同說明這你工程里有哪些文件,不用說了吧
12 lnp算是連接日誌,用來給連接器連接和定位,工程代碼總大小,都是多大,就是給你一個後悔修改的機會
11 asm 就是匯編文件了,用來和KEIL聯合模擬
4 test1我把我能認識的說說,在你工程選項里,不能打開
2 test1、數據段,他就是從無後綴文件test1里提取的,可以打開
5 test1,可以用文本編輯器打開看看,去掉了調試信息,可以打開
3 test1,比如覆蓋分析,這個文件很重要.DSN,這個是另外一個軟體PROTUES軟體的工程文件,這個是最終生成的文件,告訴你連接器連接了哪些OBJ等,沒啥說的,出了大問題必須打開它,文件有沒有被編譯過,混合編程時查看函數段名等,這就屬於PROTUES軟體了,內存使用總大小等
9 uvopt和uvproj都是keil工程文件,只要有這個文件KEIL就可以軟體模擬.DSN的附帶文件,可以打開,不在詳述
7 plg keil 的編譯日誌文件,裡面是電路圖,哪個函數調用了哪個函數.M51文件,可以打開看看
8 test1,連接器對OBJ連接後就變成了無後綴文件,這個文件是某個C文件編譯後的文件,我好像馬馬虎虎勉強都認識啦
說的不夠詳細
解決方案2:
全部翻譯就是:
生成(或構建)目標 『目標1』
正在匯編main.asm...
正在連接...
程序大小:內部直接定址data存儲區使用了8位元組,外部xdata存儲區使用0位元組,代碼大小15位元組
正在從「test」創建hex格式的文件...
工程「test」 - 0 個錯誤,0個警告
51單片機RAM區有4種:data、bdata、idata和xdata
51單片機ROM區一種:code
ROM就是 read only memory ,只讀存儲器,用來存程序的,掉電不會丟失數據
RAM就是 random access memory 隨機訪問存儲器,是內存,掉電後數據全部丟失
③ C語言格式怎麼轉換成hex格式
有兩種方法:
1、用相應的IDE(例如:keil)創建一個工程,然後將該C語言文件中的代碼復制到工程中的目錄下。然後使用keil 對該工程進行編譯。這樣就可以得到hex文件。
2、使用相應的編譯器,一步一步的編譯。
不推薦第二種方法因為,單獨使用編譯器編譯需要很多麻煩的步驟,還有可能會出錯。直接使用IDE會更加方便省去很多麻煩的步驟。
④ 我想要將自己編寫的C語言程序轉換成能在KEIL中進行模擬的hex文件,怎樣做啊,希望能給出具體的步驟
可以直接在keil中編譯c 進行模擬。 雙擊錯誤會跳到錯誤那行, 很容易發現
⑤ 單片機c語言中,怎麼快速把二進制數轉成十六進制數
按8421碼對應
例如1111
1010
0101
從低位開始每四位對應一次8421(1代表有,0代表無)
那麼就是1111=15=F
1010=10=A
0101=5=5
所以1111
1010
0101=0xFA5
不是整四位的高位補0
11
0011
0111=0011
0011
0111=0x337
⑥ C語言格式怎麼轉換成hex格式
在KEIL軟體上建立工程項目,編輯C語言,編譯調試無錯後,點擊project下的optionsfortarget,在output標簽下勾選輸出HEX,確定後就在編譯一下會自動生成HEX文件在相同目錄里。