關於格式化字符串以及16進制與點分十進制轉換的理解
阿新 • • 發佈:2018-02-12
std nbsp 測試 超過 hex spa inet_pton number body
由點分十進制轉成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是規定了最小值,超過時階段,不足時不填充
關於格式化字符串以及16進制與點分十進制轉換的理解