主頁 >  其他 > <C語言>資料檔案自動生成(進階優化改造)

<C語言>資料檔案自動生成(進階優化改造)

2021-04-27 12:10:13 其他

功能描述:基于上一篇“資料檔案自動生成的實作(多模塊進階)”文章,對工程專案進行包括使用.ini檔案存盤配置引數、增加.dat檔案(二進制檔案)的方式記錄隨機生成資料、利用結構體陣列暫存隨機生成資料和呼叫程式計時函式對程式計時等功能的優化改造,
關鍵詞:.ini組態檔;結構體陣列;.dat二進制檔案;程式計時
讀者注意:本文章基于此前兩篇文章寫作,若對部分代碼有疑惑,可查看
<C語言>資料檔案自動生成的實作
<C語言>資料檔案自動生成(多模塊進階)


0 緒論

一個程式要走向實用是需要和編譯器、編譯環境脫離開的,我們的程式在編譯環境下創建,每次對程式的更改,哪怕只是某個數值的變化都需要編譯器重新編譯才能使用,這種開放式的程式給了用戶極大的權限和自由,但不恰當的操作也會導致系統崩潰,所以一般實用程式為了使用安全(或保護著作權),對外都是全封閉的,而滿足用戶對程式某些引數進行配置的需求,是通過使用組態檔來實作的,這就好比使用智能手機時,在同一套程式下,可以使用設定工具改變一些使用習慣的程序(程式的某些引數發生了變化),

1 通過.ini檔案獲取配置引數

  • .ini 檔案是Initialization File的縮寫,即初始化檔案,是 windows 的系統組態檔所采用的存盤格式,統管 windows 的各項配置;
  • 組態檔有很多如INI組態檔,XML組態檔,還有就是可以使用系統注冊表等, 當然INI組態檔的后綴名也不一定是 .ini ,也可以是 .cfg,.conf 或者是 .txt;
  • .ini 檔案同 .txt 檔案等都使用ASCII編碼,用戶可以在記事本或寫字板對其內容進行讀寫操作;
  • INI組態檔有其經典格式:包含 parameters,sections 和 comments 三個基本要素,本工程中只是最簡單的利用 .ini 檔案存盤個別數值,當作一般 .txt 檔案使用,所以在這里不作過多探究,

將 .ini 檔案獲取配置引數的程式封裝為一個函式,并單獨作為一個源檔案,
實際上這種極簡單的組態檔類似于此前說到的 cmd 命令視窗,兩者都作為一種程式內外互動的方式,若其格式不規范會造成程式無法正常運行,此前工程引入了大量程式以確保命令列引數的規范性問題,此處也應對組態檔的內容進行一定的鑒別,
具體代碼如下:

//獲取組態檔資訊給結構體初始化默認值,CONF* conf(配置引數結構體指標),char* Ini_Path(組態檔檔案名指標)
void getInfoParam(CONF* conf, char* Ini_Path)
{
	char str[MAX_STR_LEN] = {0};
	int flag = 0;//規范性標志位,為0時表示規范
	int hang = 0;//組態檔有效行數值

	FILE *fp = NULL;
	fp = fopen(Ini_Path, "r");//ini檔案是用ASCII值的檔案,用"r"
	if(!fp) 
	{ 
		printf("打開組態檔失敗,結構體各分量已使用默認值!\n");
		flag = 1;
	}
	else
	{
		while(!feof(fp))
		{
			fgets(str, sizeof(str), fp);
			if(*str != 0 && strcmp(str, "\n") != 0)//篩除空行
			{
				hang++;
			}
			memset(str, 0, sizeof(str));//清除字串str中的資料
		}
		if(hang >= 8)
		{
			rewind(fp);//指標回到檔案打開初始位置
			strcpy(conf->filesavepath, fgets(str, MAX_STR_LEN, fp));
			strcpy(conf->filename, fgets(str, MAX_STR_LEN, fp));
			conf->maxvalue1 = strToNumber(fgets(str, MAX_BUF, fp));
			conf->minvalue1 = strToNumber(fgets(str, MAX_BUF, fp));
			conf->maxvalue2 = strToNumber(fgets(str, MAX_BUF, fp));
			conf->minvalue2 = strToNumber(fgets(str, MAX_BUF, fp));
			conf->recordcount1 = strToNumber(fgets(str, MAX_BUF, fp));
			conf->recordcount2 = strToNumber(fgets(str, MAX_BUF, fp));
			
			if(strcmp(conf->filesavepath, "\n") == 0 || strcmp(conf->filename, "\n") == 0 || conf->maxvalue1 == 0 || conf->minvalue1 == 0 || conf->maxvalue2 == 0 || conf->minvalue2 == 0 || conf->recordcount1 == 0 || conf->recordcount2 == 0)//篩除空行賦值
			{
				printf("組態檔引數值有誤,結構體各分量已使用默認值!\n");
				flag = 1;
			}
			else if(conf->maxvalue1 <= conf->minvalue1 || conf->maxvalue2 <= conf->minvalue2 || conf->recordcount1 <= conf->recordcount2)//篩除不正確的值關系
			{
				printf("組態檔引數值有誤,結構體各分量已使用默認值!\n");
				flag = 1;
			}
			else
			{
				printf("組態檔配置結構體分量初始值成功!\n");
			}
		}
		else
		{
			printf("組態檔引數數目不足,結構體各分量已使用默認值!\n");
			flag = 1;
		}
		fclose(fp);
	}
	//組態檔出錯,結構體初始默認值
	if(flag == 1)
	{
		strcpy(conf->filesavepath, "Lab4Data\\");
		strcpy(conf->filename, "Lab4.txt");
		conf->number = 0;
		conf->maxvalue1 = 20;
		conf->minvalue1 = 1;
		conf->maxvalue2 = 100;
		conf->minvalue2 = 0;
		conf->recordcount1 = MAX_NUM;
		conf->recordcount2 = MIN_NUM;
	}
}

由代碼及注釋可以看出,為保證程式的運行,在組態檔的內容不規范時直接進行了報錯,而組態檔的錯誤區分三種情況:一是組態檔行數(引數個數)小于結構體所需引數個數,為避免空行對行數的影響,判斷時做空行篩除處理;二是組態檔在有效行數(有效引數個數)大于等于結構體所需引數個數時,給結構體成員按序賦值,為避免空行對結構體成員賦無效值,對所有結構體成員值做篩除處理;三是在滿足上述兩點情況下邏輯判斷三組 int 值的大小,最大值不可小于等于最小值,
滿足以上三點才認為組態檔內容規范正確,這極大保障了程式的安全運行,若組態檔內容不符合要求,程式設定結構體各成員使用程式內給出的初始默認值以繼續運行,

2 利用結構體陣列暫存資料

仍然使用 typedef 關鍵字定義結構體,結構體 DataItem 內部存盤的是三元組的三個資料,多個結構體組成結構體陣列,結構體陣列依次存入 conf.number 條三元組資料,
結構體定義代碼如下:

typedef struct DataItem
{
	int item1; //資料記錄三元組的第一個元素
	int item2; //資料記錄三元組的第二個元素
	int item3; //資料記錄三元組的第三個元素
}DATAITEM;

在此前的文章中,使用的是二維陣列的方式來快取隨機生成的資料記錄,因為二維陣列只有行數不定,而列數始終為3,所以使用結構體陣列非常合適,這里優先使用結構體陣列,因為二維陣列的動態記憶體申請函式 malloc的使用和釋放都是是分為兩步進行的,而結構體陣列只需要一步即可(去掉for回圈程序),將兩者代碼作對比如下:

	//二維陣列動態記憶體申請
	int **a = (int**)malloc(sizeof(int*) * n);       //申請n行動態記憶體分配空間
	for (int i = 0; i < n; i++)
	{
		a[i] = (int *)malloc(sizeof(int) * 3);       //申請3列動態記憶體分配空間
	}
	
	//二維陣列動態記憶體釋放
	for (int i = 0; i < n; i++)       
	{
		free(a[i]);                                  //逐個釋放指標記憶體
	}
	free(a);                                         //釋放指向指標的二級指標記憶體
    //結構體陣列態動態記憶體申請
    DATAITEM *s, *p;
	s = (DATAITEM*)malloc(sizeof(DATAITEM) * conf.number);//申請conf.number個動態結構體陣列
	p = s;
	
	//結構體陣列態記憶體釋放
	free(s); 

注意到使用了兩個指標 s 和 p 指向結構體陣列,指標 s 申請了動態記憶體空間,不讓指標 s 進入到 for 回圈而使用指標 p 進入回圈,是因為指標 p 在回圈里每回圈一次執行 p++ 時,其值都會被修改,每次給指標 p 的成員賦值后都存入回圈外的指標 s 即可給結構體陣列依次賦值,

    DATAITEM *s, *p;
	s = (DATAITEM*)malloc(sizeof(DATAITEM) * conf.number);//申請conf.number個動態結構體陣列
	p = s;
	for(int i = 0; i < conf.number; i++)
	{
		p->item1 = random(conf.maxvalue1, conf.minvalue1);
		p->item2 = random(conf.maxvalue1, conf.minvalue1);
		while(p->item2 == p->item1)   //取第二項值不同于第一項值
		{
			p->item2 = random(conf.maxvalue1, conf.minvalue1);
		}
		p->item3 = random(conf.maxvalue2, conf.minvalue2);
		p++;
	}

3 使用.dat檔案以二進制存盤數值(位元組序)

在前兩篇文章中都是使用了 .txt 檔案存盤文本檔案,使用 .dat 檔案存盤二進制檔案的操作與其是極為相似的,該工程可以同時生成這兩種格式的檔案,故將兩者程式對比如下:

    //生成.txt文本檔案
    FILE *fpt = NULL;
	fpt = fopen(buffer,"w");
	if(!fpt)
	{
		printf("檔案打開失敗!\n");
	}
	else  //檔案打開/創建成功
	{
		start = clock();
		fprintf(fpt, "%d\n", conf.number);//在檔案中列印條數資訊
		//將結構體陣列s中的元素列印到檔案中
		for (int i = 0; i < conf.number; i++)
		{
			fprintf(fpt, "%d,%d,%d", s[i].item1, s[i].item2, s[i].item3);
			fprintf(fpt,"\n");
		}
		fclose(fpt); //關閉檔案
		printf("輸出文本檔案‘%s’生成成功!\n",conf.filename);
		end = clock();
		printf("生成文本檔案時間:%fs\n", (double)(end - start) / CLOCKS_PER_SEC);
	}
    //生成.dat二進制檔案
    FILE *fpd = NULL;
	fpd = fopen(new_buffer,"wb");
	if(!fpd)
	{
		printf("檔案打開失敗!\n");
	}
	else  //檔案打開/創建成功
	{
		start = clock();
		fwrite((char*)&conf.number, sizeof(int), 1, fpd);//在檔案中列印條數資訊
		char ch[]="\n\r";
		fwrite(ch, 2, 1, fpd);

		//將結構體陣列s中的元素列印到檔案中
		for (int i = 0; i < conf.number; i++)
		{
			fwrite(&s[i], sizeof(int), 3, fpd);
			char ch[]="\n\r";
			fwrite(ch, 2, 1, fpd);
		}
		fclose(fpd); //關閉檔案
		printf("輸出二進制檔案‘%s’生成成功!\n", new_filename);
		end = clock();
		printf("生成二進制檔案時間:%fs\n", (double)(end - start) / CLOCKS_PER_SEC);
	}

可以看到,首先是檔案打開/創建的方法不同,.txt 文本檔案使用"w"進行寫操作, .dat 二進制檔案使用"wb"進行寫操作,然后兩者的資料寫入函式不同,在 .txt 文本檔案中寫入資料呼叫的是 fprintf() 函式,而在 .dat 二進制檔案中寫入資料呼叫的是 fwrite() 函式,fprintf() 函式更像我們平時使用的 printf() 函式,換行操作可以直接用“\n”實作,符號寫入也可以直接寫入,而 fwrite() 函式需要單獨寫入"\n\r"這個兩位元組長度的符號才可以,因為二進制檔案的不具備直接閱讀性,所以可省略所有可視化符號的寫入,程式中的換行符亦不需要("\n"是換行符,"\r"是游標移動到行首),

對于整數的二進制存,二進制檔案有位元組序的概念,位元組序即位元組在電腦中存放時的序列與輸入(輸出)時的序列是先到的在前還是后到的在前,
常見的位元組序是小端模式(Little endian)大端模式(Big endian),小端模式最符合人的思維,地址低位存盤值的低位,地址高位存盤值的高位;大端模式最直觀,地址低位存盤值的高位,地址高位存盤值的低位,把記憶體地址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的順序寫出,
對于作業系統之上的應用程式來說,位元組序實際上是由作業系統和編譯器決定的,而作業系統和編譯器所提供給應用程式的運行環境的默認位元組序一定是CPU支持的位元組序,

可以構造一個函式用來檢測這兩種常用位元組序,函式如下所示:

void test_endian()
{
    uint32_t i = 0x04030201;
    unsigned char* cp=(unsigned char*)&i;
    if(*cp == 1)
        printf("本實驗是小端位元組序(little-endian)\n");
    else if(*cp == 4)
        printf("本實驗是大端位元組序(big-endian)\n");
    else
        printf("位元組序未知\n");
}

其中 uint32_t 在標準頭檔案 stdint.h 中定義,

4 呼叫程式計時函式對程式計時

這里主要介紹C語言對程式計時的三種常用方法;

方法一clock() 函式,函式原型:clock_t clock(void)
其中clock函式回傳從開始這個程式到呼叫的clock()函式之間的CPU時鐘計時單元(click tick)數, 回傳值型別是clock_t,其中CLOCKS_PER_SEC是一個已宏定義的常數(通常為1000),表示1秒鐘有多少個時鐘計時單元,精確值:精確到毫秒,

#include <time.h>
int main()
{
    clock_t start, end;
    start = clock();
    /*...需要計時的代碼...*/
    end = clock();
    printf("time=%f\n", (double)(end - start) / CLOCKS_PER_SEC);
    return0;
}

方法二time() 函式,difftime() 函式,函式原型:time_t time(time_t, * timer),double difftime(time_t, time_t)
在C語言中用 time() 函式獲取自Unix標準時間戳(1970年1月1日0點0分0秒,GMT)到當前的秒數, difftime(t2 - t1) 要比 t2 - t1 更準確,diffime會根據機器進行轉換,精確值:精確到秒

#include <time.h>
int main()
{
    time_t start, end;
    start = time(NULL);
    /*...需要計時的代碼...*/
    end = time(NULL);
    printf("time = %d秒\n", difftime(end, start));
    return0;
}

方法三gettimeofday() 函式,函式原型:int gettimeofday(struct timeval *tv, struct timezone *tz)
這個函式是 linux 系統專屬函式,可以精確到微秒,其中引數 tv 是保存獲取時間的結果型別,引數 tz 用于保存時區結果(若不使用可以傳入NULL) ,精確值:精確到微秒,

#include <time.h>
int mian()
{
    struct timeval start, end;
    gettimeofday(&start, NULL);
    /*...需要計時的代碼...*/
    gettimeofday(&end, NULL);
    longtimeuse = 1000000*(end.tv_sec - start.tv_sec) + end.tv_usec-start.tv_usec;
    printf("time =%f 秒\n", timeuse/1000000)
    return0;
}

方法一能使用于大多作業系統,本工程也使用該函式進行程式計時,具體使用代碼在文本檔案和二進制檔案生成代碼中可以看到;
方法二統計的時間精確到秒,針對的是運行時間較長,或者有明顯的時間差的程式,可移植性好,性能穩定,在設定隨機種子已多次使用;
方法三是 linux 系統專屬使用方法,
本工程使用方法一對生成資料存入結構體、生成文本檔案、生成二進制檔案三個程序的時間進行了資訊列印,在對應程序位置可看到相應秒數,

5 測驗運行

區別于前兩篇文章,本工程在命令列引數輸入之外還有組態檔的讀入,在程式處理順序上,對命令列引數的處理滯后于對組態檔的處理,測驗分為兩部分進行:

5.1 組態檔測驗

情況1:行數為8行,有效行數為7行(中間空行),應輸出“組態檔引數數目不足……”

情況2:行數為8行,有效行數為7行(作結束行空行),應輸出“組態檔引數數目不足……”

以上兩情況輸出如下所示:


情況3:行數為9行,有效行數為8行(字符為“\n”),應輸出“組態檔引數值有誤……”

情況4:行數為9行,有效行數為8行(數值為0),應輸出“組態檔引數值有誤……”

情況5:行數為8行,有效行數為8行(第一組最大最小值相等),應輸出“組態檔引數值有誤……”

以上三情況輸出如下所示:


情況6:行數為8行,有效行數為8行(格式規范),應輸出“組態檔配置結構體分量初始值成功!”

以上情況輸出如下所示:


由以上6種情況可以看到,只有當有效行數大于等于8時,組態檔才會依次給結構體成員賦值,且能確保結構體的8個成員都能取到有效值(非空非0),還要在各取值區域符合大小關系時,組態檔才會配置結構體分量初始值成功,
為了使組態檔在有誤狀態下程式依然能夠繼續運行下去,當判斷到任何錯誤情況,程式都會默認使用內部設定的結構體成員初始化默認值,所以在錯誤情況列印資訊中能看到“結構體各分量已使用默認值!”的字樣,以上系列判斷措施都是對程式健壯性的增強,

5.2 命令列引數測驗

以下測驗是基于組態檔規范正確的情況下進行的,即使考慮組態檔一旦有誤,結構體各分量也會使用初始化默認值(和規范正確組態檔取同值,多一個 conf->number 的賦值無影響),
命令列引數輸入情況如下:
1.“Lab4 r . .\Debug\test1 a” 一次輸入,應:隨機生成[50, 200]間的記錄條數,路徑存在,生成資料存入“test1.txt” 和 “test1.dat”;
2.“Lab4 r . .\Debug\test2 d” 一次輸入,應:隨機生成[50, 200]間的記錄條數,路徑存在,生成資料存入“test2.dat”;
3.“Lab4 r . .\Debug\test3 t” 一次輸入,應:隨機生成[50, 200]間的記錄條數,路徑存在,生成資料存入“test3.txt”;
4.“Lab4 r . .\Debug\test4 qa” 一次輸入,應:隨機生成[50, 200]間的記錄條數,路徑存在,默認生成兩種檔案,生成資料存入“test4.txt” 和 “test4.dat”;
5.“Lab4 r . .\Debug\test5” 一次輸入,應:隨機生成[50, 200]間的記錄條數,路徑存在,生成資料存入“test5.txt” 和 “test5.dat”;
6.“Lab4 . .\Debug\test6 r a” 、“r” 依次輸入,應:隨機生成[50, 200]間的記錄條數,路徑使用當前作業目錄,生成資料存入“r.txt” 和 “r.dat”;
7.“Lab4 . .\Debug\test7 r a c” 一次輸入,應:輸入引數超限制,系統無法處理;
8.“Lab4” 、“r” 、“. .\Debug\test8”依次輸入,應:隨機生成[50, 200]間的記錄條數,路徑使用當前作業目錄,生成資料存入“test8.txt” 和 “test8.dat”;

測驗1~8結果如下四圖所示:




由測驗結果可見各列印資訊與邏輯推斷相同,生成的各值均在上下限范圍內(包括隨機生成條數和各元素資料數值),對于二進制檔案需要特定軟體打開,此處不進行查看,

6 工程代碼

工程專案下載鏈接:https://download.csdn.net/download/qq_41804982/17813271

本工程對各功能模塊進行了函式封裝,格式規范、注釋詳細、易于閱讀,

7 寫在后面

【相對路徑】對相對路徑的正確輸入格式做一下說明:正確格式為". .\Lab4\Debug\test.txt “,檔案C語言中單斜杠“\”一般用于轉義字符,若表示路徑中的單斜杠,最好使用“\ \”表示,更加安全,所以用”. .\ \Lab4\ \Debug\ \test.txt "更好,因為該軟體在撰寫會自動轉義輸出,為了展現時不出錯,在相同符號間添加了空格隔開,所以讀者看到的以上路徑中會有空格,在使用時請自行去除空格,
【測驗作業】到現在作者愈發意識到測驗作業的重要性,每次寫文章,測驗運行這一塊總是最耗時耗力的,測著測著就會發現有意外發生,然后又去代碼里看出錯的地方,有時錯誤比較隱蔽,還需要監視各個變數才能查找出來,這之后又重頭進行新一輪測驗,以讓讀者看到的測驗程序無誤呈現,當然,限于水平,仍有一些錯漏之處在所難免,若作者對讀者形成了誤導,敬請諒解,

8 參考資料

<C語言>資料檔案自動生成的實作https://blog.csdn.net/qq_41804982/article/details/114909367
<C語言>資料檔案自動生成(多模塊進階)https://blog.csdn.net/qq_41804982/article/details/115958867

C語言讀取.ini組態檔:
https://www.jianshu.com/p/6088c3c2488d
https://blog.csdn.net/chexlong/article/details/6818017
https://blog.csdn.net/weixin_33737134/article/details/94273057
結構體陣列:
https://bbs.csdn.net/topics/280016730
二進制檔案:
https://baike.baidu.com/item/fwrite/10942398?fr=aladdin https://blog.csdn.net/Megurine_Luka_/article/details/104451789
位元組序判斷:
https://blog.csdn.net/earbao/article/details/53668806
程式計時函式:
https://www.douban.com/group/topic/127994831/

感謝眾多網友的系列參考資料,在此向所列資料作者致謝,也向一些缺漏的作者致歉,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280554.html

標籤:其他

上一篇:從零開始學習STM32(一)—— 新建工程模板

下一篇:開源的關于智能車競賽光電起始點的開源方案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more