由子网掩码字符串转换成长度前缀的代码示例
最近在進行的ONVIF任務,有一個接口是設置IP的,叫SetNetworkInterfaces,可以設置包括網絡速率、雙工、自動協商等功能,還可以改IP。但里面有子網掩碼字段,只有一個叫PrefixLenght的,直譯為前綴長度。具體如下:
IPv4 - optional; [IPv4NetworkInterfaceSetConfiguration]
IPv4 network interface configuration.
?Enabled - optional; [boolean]
? ? ? ? ? ? ?Indicates whether or not IPv4 is enabled.
Manual - optional, unbounded; [PrefixedIPv4Address]
? ? ? ? ? ? ?List of manually added IPv4 addresses.
?Address [IPv4Address]
? ? ? ? ? ? ? ? ? ? ?IPv4 address
PrefixLength [int]
? ? ? ? ? ? ? ? ? ? ?Prefix/submask length
PrefixLength就是子網掩碼的長度。比如子網掩碼為“255.255.0.0”,則PrefixLength為16。為了做轉換,特意寫了2個函數。
1、由子網掩碼算出前綴長度
int ipv4_str2prefixlen(const char* ip_str) {int ret = 0;unsigned int ip_num = 0;unsigned char c1,c2,c3,c4;int cnt = 0;ret = sscanf(ip_str, "%hhu.%hhu.%hhu.%hhu", &c1, &c2, &c3, &c4);ip_num = c1<<24 | c2<<16 | c3<<8 | c4;// fast...if (ip_num == 0xffffffff) return 32;if (ip_num == 0xffffff00) return 24;if (ip_num == 0xffff0000) return 16;if (ip_num == 0xff000000) return 6;// just in casefor (int i = 0; i < 32; i++){//unsigned int tmp = (ip_num<<i);//printf("%d tmp: %x\n", i+1, tmp);if ((ip_num<<i) & 0x80000000)cnt++;elsebreak;}//printf("cnt: %d\n", cnt);return cnt; }2、由前綴長度算出子網掩碼
1、內部功能函數一般不作嚴格、詳細的參數驗證,比如IP的合法性沒作檢查。
2、一些常用的、已知的常識,應該優先使用,比如,我們知道“255.255.0.0”的前綴長度是16,則可以直接寫出來,不再做轉換。
3、最近搞ONVIF,真正認識到存儲空間和運行時效率。在嵌入式中,flash有限,所以存儲空間也要注意,用gsoap生成的ONVIF代碼比較大,即使使用-O3優化并strip,也有10MB,真的很占空間。另外,有些功能模塊可以統一在一處作參數合法性判斷而不用每個函數都做。比如上面的示例代碼就不用IP合法性判斷,因此我調用之前已經做了,這樣可以節省一些運行時的指令代碼。不過,我們公司架構因為分層級關系,基本上經過review后的代碼,每一層都有參數的檢查。從效率上看,我依然堅持能省即省的原則。
李遲 2016.01.24 于加班回來晚飯前 (聽說南寧青秀山下雪了,今天去加班的我的世界也開始下雪)
總結
以上是生活随笔為你收集整理的由子网掩码字符串转换成长度前缀的代码示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZYNQ之FPGA学习----RAM I
- 下一篇: sqlserver加载驱动失败的问题