㈠ c語言中採用二進制文件存儲數據的問題
在磁碟的存儲上都是二進制存儲這點上都一樣。
從文件編碼的方式來看,文件可分為ASCII碼文件和二進制碼文件兩種。
ASCII文件也稱為文本文件,這種文件在磁碟中存放時每個字元對應一個位元組,用於存放對應的ASCII碼。例如,數5678的存儲形式為:
ASC碼: 00110101 00110110 00110111 00111000
↓ ↓↓ ↓
十進制碼: 5678 共佔用4個位元組。ASCII碼文件可在屏幕上按字元顯示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內容。 由於是按字元顯示,因此能讀懂文件內容。
二進制文件是按二進制的編碼方式來存放文件的。 例如, 數5678的存儲形式為: 00010110 00101110隻佔2個位元組。二進制文件雖然也可在屏幕上顯示, 但其內容無法讀懂。
流可以分為兩種類型:文本流和二進制流。文本流是解釋性的,最長可達255個字元,其中回車/換行將被轉換為換行符「/n」,(如果以"文本"方式打開一個文件,那麼在讀字元的時候,系統會把所有的"/r/n"序列轉成"/n",在寫入時把"/n"轉成"/r/n" archim 's opinion )。二進制流是非解釋性的,一次處理一個字元,並且不轉換字元。
通常,文本流用來讀寫標準的文本文件,或者將字元輸出到屏幕或列印機,或者接受鍵盤的輸入;而二進制流用來讀寫二進制文件(例如圖形或字處理文檔),或者讀取滑鼠輸入,或者讀寫數據機。
如果用文本方式打開文件,會把「0D 0A」自動變換成「/n」來存在內存中。寫入的時候反向處理。 而二進制方式打開的話,就不會有這個過程。
所以從上面可以看出:文本文件占磁碟空間大,讀取速度比較慢,但打開後容易理解;二進制文件占磁碟空間小,讀取速度快,如果要理解文件文件的意思需要自己進行解釋。
㈡ 如何將一個函數編譯成二進制文件
通過下面這條命令,main.c和swap.c 就產生了一個可執行二進制文件swap
》gcc mian.c swap.c -o swap
那麼這條命令是么樣把源程序變成可執行程序的呢?
步驟如下:
1、驅動程序首先調用C預處理器(CPP)把源文件翻譯成一個ASCII中間文件mian.i,預處理器會把#include所包含的內容都插入到聲明的位置,並且做宏替換,把main.c 文件的第3行 的SIZE替換成2(注意這里只是做簡單的文本替換)。
2、接下來驅動程序的C編譯器將main.i翻譯成匯編語言程序main.s
3、然後驅動程序的匯編器將匯編語言程序main.s 翻譯成可重定位的二進制文件main.o
4、最後運行鏈接器將main.o 與swap.o 以及一些必要的系統目標文件(比如你將調用的printf函數就是printf.o)連接起來變成一個可執行的二進制文件。
㈢ c語言新建二進制文件問題。
屬於馬大哈類型的問題
if (!(fnew=fopen(new_name,"wb"))); //後面多了分號了
還有,第二次打開文件是給frar,不是fpic了,你大概復制的,還是fpic沒改
㈣ 同求二進制編輯器源代碼,我現在自己寫的讀入二進制文件,寫入文本,可出來的都是亂碼,所以想要個寫好的
3.74 icePub_fileHexToHexString
l 函數原型:
int WINAPI icePub_fileHexToHexString(char *strBinFilename,char *strHexStringFilename,int flag)
輸入:strBinFilename 待處理文件名
strHexStringFilename 生成hex串文件名
flag 格式標志,0無格式;>0每位元組空格分隔,並且每處理flag個數據就換行
輸出:
l VC連接Lib方式聲明
__declspec(dllexport)
int WINAPI icePub_fileHexToHexString(char *strBinFilename,char *strHexStringFilename,int flag);
l 動態調用常式
VC sample代碼:
typedef int (WINAPI ICEPUB_FILEHEXTOHEXSTRING)( char *strBinFilename,char *strHexStringFilename,int flag);
ICEPUB_FILEHEXTOHEXSTRING *icePub_fileHexToHexString = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_fileHexToHexString =(ICEPUB_FILEHEXTOHEXSTRING *)GetProcAddress(hDLLDrv,"icePub_fileHexToHexString");
}
if(icePub_fileHexToHexString)
{
icePub_fileHexToHexString ("a.exe","a.txt",16);
}
if(hDLLDrv)
FreeLibrary(hDLLDrv);
VB sample 代碼:
Private Declare Function icePub_fileHexToHexString Lib "icePubDll.dll" (ByVal strBinFilename As String,ByVal strHexStringFilename As String,ByVal flag As Integer) As Integer
Dim a2 As Integer
a2=icePub_fileHexToHexString("a.exe","a.txt",16)
㈤ C/C++語言編譯生產可執行的二進制文件的過程求大神詳盡解釋,
預編譯。編譯器將你的.c、.cpp源代碼,通過解釋其中的預編譯指令,將源代碼轉換成相應的沒有任何預編譯指令的代碼。
編譯、優化。將上一步的代碼編譯成匯編指令,並作一定優化,形成對應的.s匯編代碼
匯編。將.s文件匯編成機器碼,形成對應的.o目標文件,此時是不可執行的二進制文件。生成對應的清單文件。為了連接需要,還會生成未定向符號表、導出符號表、地址重定向表等等。
連接。先根據對應的清單文件、連接文件及之間的調用關系,決定所有的目標文件及引用的庫文件在最後可執行文件中的位置;然後做一些其他事情,比如根據符號表等將目標文件中的符號地址補全等等;最終得到可執行文件。
這只是我個人的簡單理解,更詳盡的解答都可以寫成好幾本書了=_=望採納~
㈥ C語言採用解釋方式將源程序轉換為二進制的目標代碼嗎
不是,C語言採用編譯方式將源程序轉換為二進制的目標代碼。使用C語言編譯器來完成。
所謂C語言編譯器,就是把編程得到的文件,比如.c,.h的文件,進行讀取,並對內容進行分析,按照C語言的規則,將其轉換成cpu可以執行的二進制文件。其本質在於對文件的讀入,分析,及處理。
C語言編寫的程序代碼稱為源程序,對於計算機本身來說,它並不能直接識別由高級語言編寫的程序。C語言程序經C語言編譯程序編譯後,生成後綴為.obj的二進制文件(稱為目標文件)。
此.obj文件必須與系統提供的各種庫函數連接起來生成一個後綴為.exe的可執行文件才可以執行。C語言的可執行文件由一系列機器指令構成的。
(6)編譯器未創建所需的二進制文件擴展閱讀
解釋執行和編譯執行是計算機語言的執行方式。解釋執行由解釋器現場解釋執行,不生成目標程序。如BASIC便是解釋執行,一般解釋執行效率較低,低於編譯執行。
編譯執行由編譯程序將目標代碼一次性編譯成目標程序,再由機器運行目標程序。如:PASCAL,C,C++,delphi等語言。效率高於解釋執行。
㈦ 不同的編譯器生成的二進制文件不同嗎
是 一樣 的
㈧ java為什麼不能生成直接執行的二進制文件,這樣速度不是更快嗎
必須的,虛擬機少不了,就算轉成exe的也需要加一個小的虛擬機進去!
㈨ Linux下有什麼好用的二進制文件編輯器
一、在Linux下查看二進制文件的軟體:
xxd (2進制)
hexmp (16進制)
二、編輯:
1、biew
2、hexedit
3、vim
Vim 來編輯二進制文件。Vim 本非為此而設計的,因而有若干局限。但你能讀
取一個文件,改動一個字元,然後把它存檔。結果是你的文件就只有那一個字元給改了,
其它的就跟原來那個一模一樣。
要保證 Vim 別把它那些聰明的竅門用錯地方,啟動 Vim 時加上 "-b" 參數:
vim -b datafile
這個參數設定了 'binary' 選項。其作用是排除所有的意外副作用。例如,'textwidth'
設為零,免得文本行給擅自排版了。並且,文件一律以 Unix 文件格式讀取。
二進制模式可以用來修改某程序的消息報文。小心別插入或刪除任何字元,那會讓程序運
行出問題。用 "R" 命令進入替換模式。
文件里的很多字元都是不可顯示的。用 Hex 格式來顯示它們的值:
:set display=uhex
另外,也可以用命令 "ga" 來顯示游標下的字元值。當游標位於一個 字元上時,
該命令的輸出看起來就像這樣:
27, Hex 1b, Octal 033
文件中也許沒那麼多換行符。你可以關閉 'wrap' 選項來獲得總覽的效果:
:set nowrap
字 節 位 置
要發現你在文件中的當前位元組位置,請用這個命令:
g CTRL-G
其輸出十分冗長:
Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 12206
最後兩個數字就是文件中的當前位元組位置和文件位元組總數。這已經考慮了 'fileformat'
選項導致換行符位元組不同的影響。
要移到文件中某個指定的位元組,請用 "go" 命令。例如,要移到位元組 2345:
2345go
使 用 XXD
一個真正的二進制編輯器用兩種方式來顯示文本: 二進制和十六進制格式。你可以在 Vim
里通過轉換程序 "xxd" 來達到這效果。該程序是隨 Vim 一起發布的。
首先以二進制方式編輯這個文件:
vim -b datafile
現在用 xxd 把這個文件轉換成十六進制:
:%!xxd
文本看起來像這樣:
0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0
0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9 7;'1.".....i.59.
現在你可以隨心所欲地閱讀和編輯這些文本了。 Vim 把這些信息當作普通文本來對待。
修改了十六進制部分並不導致可顯示字元部分的改變,反之亦然。
最後,用下面的命令把它轉換回來:
:%!xxd -r
只有十六進制部分的修改才會被採用。右邊可顯示文本部分的修改忽略不計。
樓主如果對Linux感興趣,想學習更多Linux操作知識,可以網路《Linux就該這么學》,相信會有幫助的。
㈩ 二進制文件的問題
是的。不同的語言在編譯後生成的二進制代碼的確不同,在執行效率上會有區別。