1. 程式人生 > 實用技巧 >【資訊系統安全設計基礎】——myod實驗——20181318

【資訊系統安全設計基礎】——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()
int mchar = fgetc(pfile); fgetc()函式從開啟的文字檔案中讀取一個字元。它將檔案指標作為唯一的變元,把讀取的字元返回int型別。 返回值:mchar變數int型別,因為如果到達檔案尾,就返回EOF。

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碼轉換表