報頭壓縮 ROHC報頭壓縮程式改進

2021-08-03 22:14:46 字數 4289 閱讀 1202

改進後的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。其破解原理就是遍歷密碼字典的密碼,逐個嘗試解碼,如果密碼複雜字典過大會導致破解效率下...