【資訊系統安全設計基礎】——myod實驗——20181318
一、實驗準備
1.複習c檔案處理內容
1. 檔案:能夠儲存資料的儲存裝置,檔案其實是一系列的位元組。檔案通常儲存到硬碟上。
2. 檔案中的位置:檔案有開頭和結尾,還有一個當前位置,通常定義為從檔案頭到當前位置有多少個位元組。
3. 檔案流:流是外部資料或資料目的地的抽象表示,所以鍵盤、顯示器上的命令列和磁碟檔案都是流。
將資料寫入流(即磁碟檔案)有兩種方式。
- 可以將資料寫入文字檔案,此時資料寫入為字元,這些字元組織為資料行,每一行都用換行符結束。
- 可以將資料寫入二進位制檔案。無論將資料寫入文字檔案還是二進位制檔案,不論它們是什麼樣的資料,這些資料最終都是一系列位元組。
4. 檔案訪問:
- 開啟檔案:fopen()
FILE *fopen(const char *name,const char *mode);
第一個變元是字串指標,它是要處理的外部檔名稱,它包含了檔名稱字串的地址。第二個變元也是一個字串,稱為檔案模式,它指定對檔案進行什麼處理。
- 關閉檔案:fclose()
fclose( FILE *fp );
返回值:如果成功關閉檔案,就返回0,否則返回EOF。
- 寫入文字檔案:fputc()——將一個字元寫入文字檔案
fputc(int ch,FILE *pfile);
引數:將第一個變元指定的字元寫入第二個變元(檔案指標)指定的檔案中。
返回值:如果操作成功,就返回寫入的字元,否則返回EOF
- 讀取文字檔案:fgetc()
2.學習Linux下od命令
功能:以指定格式檢視檔案內容。可以以八進位制、十進位制、十六進位制和ASCII碼的格式來顯示檔案或者流,它們對於訪問或可視地檢查檔案中不能直接顯示在終端上的字元(如換行符等)很有用。此外,在一些有空洞的檔案中可以通過od命令檢視空洞的位置。 使用格式:od [-A 地址進位制] [-t 顯示格式] 檔名
-A
( 地址進位制)按指定的進位制顯示地址資訊:
o:八進位制(系統預設值)
d:十進位制
x:十六進位制
n:不列印位移值
預設情況下,每行開頭為當前讀取到的字元數的7位八進位制表示
-t
指定資料顯示的格式:
c:ASCII字元或反斜槓序列(如\n)
d:有符號十進位制數
f:浮點數
o:八進位制(系統預設值)
u:無符號十進位制數
x:十六進位制數
二、實驗步驟
1. 編寫myod.c 用myod XXX實現Linux下od -tx -tc XXX的功能
(1)使用vim編寫head.h
#ifndef HEAD_H #define HEAD_H void hex16(char *name); void ascii(char *name); #endif
(2)編輯main函式——myod.c
#include "head.h" #include <stdio.h> void main() { char name[50]; printf("please input the textname:"); scanf("%s", name); ascii(name); hex16(name); }
(3)編輯ascii.c——輸出ASCII碼的函式
#include "head.h" #include <stdio.h> void ascii(char *name) { FILE *fp; char ch; printf("output the ascii:\n"); fp=fopen(name,"r"); ch=fgetc(fp); while (ch!=EOF) { if (ch=='\n') printf("\n"); else printf("%4d",ch); ch=fgetc(fp); } fclose(fp); }
(4)編輯hex16.c——輸出16進位制的函式
#include "head.h" #include <stdio.h> void hex16(char *name) { FILE *fp; char ch; printf("output the hex:\n"); fp=fopen(name,"r"); ch=fgetc(fp); while (ch!=EOF) { if(ch=='\n') printf("\n"); else printf("%4x",ch); ch=fgetc(fp); } fclose(fp); }
(5)對編寫好的.c檔案進行編譯
(6)隨意編寫一個.txt檔案,最好包含自己的學號資訊
20181318 hello JJY!
(7)執行剛剛生成的可執行目標檔案a.out
結論:0的ASCII碼為48,緊接著1-9的分別為49-57,發現第一行學號20181318對應的ascii碼值正確
a-z對應的ascii碼值為97-122,A-Z對應的ascii碼值為65-90,空格對應的ascii碼值為32,!對應的ascii碼值為33,發現第二行的結果正確
test.txt檔案中每一個字元對應的ASCII碼值對應的16進位制結果正確。
遇到的問題:
1.在編寫ascii.c和hex16.c檔案時,由於C語言對於檔案處理這一塊的知識比較薄弱,然後忘記了判斷檔案讀取是否到結尾和最後關閉檔案,導致輸出異常,程式無法正常編譯。
解決方法:加一層while迴圈——while (ch!=EOF)判斷檔案是否讀取到末尾。新增fclose(fp);關閉檔案
2.執行程式時無法顯示“\n”的ASCII字元及其對應的16進位制
解決方法:在程式碼內手動新增程式碼,printf(“\n”)。
2. main與其他分開,製作靜態庫和動態庫
(1)靜態庫
(2)動態庫
遇到的問題:在生成共享庫要呼叫他進行編譯時,報出圖中的錯誤,無法開啟共享檔案,即找不到動態庫檔案libmyod.so。
解決辦法:查詢資料後,瞭解到此種情況是程式在執行時,會在/usr/lib和/lib等目錄中查詢需要的動態庫檔案。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程式執行。將檔案libmyod.so複製到目錄/usr/lib中即可解決。
sudo cp libmyod.so /usr/lib
補充資料:動態庫的搜尋路徑搜尋的先後順序是:
1.編譯目的碼時指定的動態庫搜尋路徑;
2.環境變數LD_LIBRARY_PATH指定的動態庫搜尋路徑;
3.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;//只需在在該檔案中追加一行庫所在的完整路徑如"/root/test/conf/lib"即可,然後ldconfig是修改生效。
4.預設的動態庫搜尋路徑/lib;
5.預設的動態庫搜尋路徑/usr/lib。
3. 編寫Makefile
四、實驗心得
這次實驗給我最大的感觸就是基礎不牢想往後走真的是太難了。當時學C語言欠下的債現在要自己一點點重新學習,然後才能趕上大家。當時學C語言時基本上就沒有學檔案這一塊,更沒有對這方面進行練習,可能唯一得到練習的機會就是計算機實習,但是當時也只是草率的學了一下,把一些最常用的東西僅僅做到了記住然後去使用,但是並沒有真正的理解他們,所以半年過去,又把他們給忘記了。這就讓我明白只有通過多加練習才能真正的打牢基礎!
這次的實驗又讓我學習了Linux下的一條指令——od。檔案在我們進行程式設計時是經常用到的一種格式,所以學習這些指令可以幫助我們在今後的學習道路中更加順利!做完這次實驗既是對之前學習內容的一次複習,也是對新知識的一次獲取。遇到問題不要怕,思考總會解決他們!
參考資料:1.https://www.jianshu.com/p/418e58c666e3——Linux下的od命令
2.https://blog.csdn.net/white_idiot/article/details/52618538——C語言檔案處理
3.http://ascii.911cha.com/——ASCII碼轉換表