关于格式化字符串以及16进制与点分十进制转换的理解

Posted lan126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于格式化字符串以及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是规定了最小值,超过时阶段,不足时不填充

 

以上是关于关于格式化字符串以及16进制与点分十进制转换的理解的主要内容,如果未能解决你的问题,请参考以下文章

关于个Base64,MD5,16进制的转换

XSLT 中的十进制格式以及字符

IPv6基础学习笔记

给你IP地址让你算出掩码(点分十进制),子网地址,广播地址。

PHP里,16进制格式字符串,转换成具体值的方法

16进制字符串如何转化16进制数值