关于格式化字符串以及16进制与点分十进制转换的理解
由点分十进制转成16进制
思路是获得点分十进制的字符串后由inet_pton函数将该字符串转换成
一个二进制数组由val存储
然后用"%02x"格式字符串来打印出来它的flags为0即用零填充
width为2即宽最小为2不足则填充
#include <arpa/inet.h> #include <stdio.h> int main(int argc,char **argv) { char *pstring = argv[1]; unsigned char val[4] = {0}; inet_pton(AF_INET,pstring,val); size_t c; printf("0x"); for(c = 0;c < sizeof val / sizeof *val;c++) printf("%02x",val[c]); printf("\n"); return 0; }
这个过程则是与上面相反的过程
首先得到hexstring即16进制的字符串
然后用sscanf将字符串解释成2进制数组
这里"%2hhx" 2为width即一次最多读入2个字符并且将它们解释成16进制数存于val中
然后用inet_ntop函数将它们转换成点分十进制用dst指向它,测试了一下buf中的内容也是这个点分十进制
#include <arpa/inet.h> #include <stdio.h> #include <string.h> int main(int argc,char **argv) { char *hexstring = argv[1],*pos = hexstring+2; unsigned char val[4] = {0}; size_t c; for(c = 0;c < 4;c++) { sscanf(pos,"%2hhx",&val[c]); pos += 2; } unsigned char *src = val; char buf[INET_ADDRSTRLEN]; const char *dst; dst = inet_ntop(AF_INET,src,buf,INET_ADDRSTRLEN); printf("%s\n",dst); return 0; }
最后比较一下了下列区别
printf("%3s\n","abcedfg"); printf("%.3s\n","abcedfg");
=> abcedfg
=>abc
可见对于width的number是规定了最小值,超过时不截断,不足时加填充位
而对于precision的number是规定了最小值,超过时阶段,不足时不填充
Yosoro