改進後的rohc程式實現的功能如下:
示例程式中使用到的函式功能總結如下:
rohc_init_buf_empty()
//將rohc_buf結構體資料部分初始化
rohc_comp_new2()
//建立壓縮器
rohc_comp_enable_profile()
//壓縮類設定profile-enable
rohc_buf_data()
//獲取data快取的位置
rohc_buf_data_at()
//獲取給定偏離值offset的data快取位置
//在已有資料之後再新增一定長度資料,同時改變原data長度值
rohc_compress4()
//壓縮函式
rohc_comp_free()
//釋放壓縮器資源
以下逐個部分介紹具體的實現
struct rohc_buf
/* ip資料報淨荷 */
//***************===
char *fake_payload[pkt_num];
int pktnum = 0;
for (pktnum = 0; pktnum < pkt_num; pktnum++) //每個包長度相同,內容不同
/* 隨機字串生成函式 */
//********************
char *randstr(char *dest, int n)
*dest = '\0'; //字串結束符
return (dest - n); //返回首位址
}
/* 報文結構體初始化函式 */
void rohc_buf_init_empty_p(struct rohc_buf *packet,uint8_t *buf,int len)
uint8_t *ip_buffer_p;
/* 定義儲存多個ip資料報的結構體指標陣列 */
int array_num;
struct rohc_buf *iparray[pkt_num];
for (array_num = 0; array_num < pkt_num; array_num++)
printf("size of iparray is %ld \n",sizeof(iparray));
/* 用預設引數建立rohc壓縮器 */
printf("create the rohc compressor\n");
compressor = rohc_comp_new2(rohc_small_cid, rohc_small_cid_max,gen_random_num, null);
if(compressor == null)
/* 允許ip-only和udp/ip */
if(!rohc_comp_enable_profiles(compressor, rohc_profile_ip, rohc_profile_udp, -1))
/* 生成100個相同內容的udp資料報 */
// udp報頭賦值
udp_header = (struct udphdr *)rohc_buf_data(*(udparray[count])); //呼叫系統自帶函式分配報頭空間
udp_header -> source = htons(0x04d2); //源埠1234
udp_header -> dest = htons(0x04d3); //目的埠1235
(*(udparray[count])).len = 8;
udp_header -> len = htons((*(udparray[count])).len + strlen(fake_payload[count]));
udp_header -> check = 0x0000; //此處udp校驗和使用全零不影響執行
// copy the payload just after the udp header
/* 生成100個相同內容的ipv4資料報 */
printf("build a fake ip packet every time\n");
/* ip報頭賦值 */
ip_header = (struct iphdr *) rohc_buf_data(*(iparray[count]));
ip_header-> version = 4; /* we create an ip header version 4 */
ip_header-> ihl = 5; /* min. ipv4 header length (in 32-bit words) */
(*(iparray[count])).len += ip_header->ihl * 4;
ip_header-> tos = 0; /* tos is not important for the example */
ip_header-> tot_len = htons((*(iparray[count])).len + ntohs(udp_header -> len));
printf("%ld\n",(*(iparray[count])).len);
printf("%d\n",ntohs(udp_header -> len));
printf("%d\n", ntohs((ip_header->tot_len))); //主機位元組序和網路位元組序
//記錄ip或udp/ip包長
pkt_len[count] = ntohs((ip_header->tot_len));
ip_header-> id = 0; /* id is not important for the example */
ip_header-> frag_off = 0; /* no packet fragmentation */
ip_header-> ttl = 1; /* ttl is not important for the example */
ip_header-> protocol = 17; /* protocol number */
// ip_header-> check = 0x3ba9; /* checksum */ //原程式直接賦值
ip_header-> saddr = htonl(0x01020304); /* source address 1.2.3.4 */
ip_header-> daddr = htonl(0x05060708); /* destination addr. 5.6.7.8 */
ip_header -> check = htons(ipchecksum(ip_header,(*(iparray[count])).len)); //位元組序轉換,否則出錯
/* copy the payload just after the ip header */
2)但排查下來發現,fake_payload不能改變是因為:
3)ip報頭中的protocol欄位應改為17,表示上層是udp型別,否則壓縮udp資料報失敗
//形參:(壓縮器,ip_packet快取位址,rohc_packet快取位址)
rohc_status = rohc_compress4(compressor, (*(iparray[count])), rohcarray[count]);
這裡統計所有資料報的總長和壓縮位元組數進行計算
acknowledgements:
(rohc官網示例教程)
(rohc協議庫改造)
2017.07.18
字串壓縮程式
通過鍵盤輸入一串小寫字母 a z 組成的字串。請編寫乙個字串壓縮程式,將字串中連續出席的重複字母進行壓縮,並輸出壓縮後的字串。壓縮規則 1 僅壓縮連續重複出現的字元。比如字串 abcbc 由於無連續重複字元,壓縮後的字串還是 abcbc 2 壓縮欄位的格式為 字元重複的次數 字元 例如 字串 yyy...
通過程式壓縮 解壓檔案
通過引用一dll icsharpcode.dll 可以實現所述功能。一 壓縮檔案 using system using icsharpcode.sharpziplib using icsharpcode.sharpziplib.checksums using system.io using icsh...
破解 zip 壓縮包程式
目錄 位址如下 在當前目錄有三個檔案 目前,zip格式屬於幾種主流的壓縮格式之一,其競爭者包括rar格式以及開放原始碼的7 zip格式。從效能上比較,rar格式較zip格式壓縮率較高,但是它的壓縮時間遠遠高於zip。其破解原理就是遍歷密碼字典的密碼,逐個嘗試解碼,如果密碼複雜字典過大會導致破解效率下...