zoukankan      html  css  js  c++  java
  • 关于格式化字符串以及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("
    ");
      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
    ",dst);
      return 0;
    }

    最后比较一下了下列区别

    printf("%3s
    ","abcedfg");
    printf("%.3s
    ","abcedfg");

    => abcedfg

    =>abc

    可见对于width的number是规定了最小值,超过时不截断,不足时加填充位

    而对于precision的number是规定了最小值,超过时阶段,不足时不填充

  • 相关阅读:
    javaWeb学习笔记之关于重定向和请求转发的区别
    javaWeb学习笔记之关于Servlet文件下载
    javaWeb学习笔记之关于http
    javaWeb学习笔记之关于tomcat
    小程序订阅消息推送
    Oracle数据库序列的相关问题
    将本地项目push到gitlab仓库中
    面试之BI-SQL--table转换[2]
    面试之BI-SQL--table转换
    面试之C#--垃圾回收器什么时候回收?
  • 原文地址:https://www.cnblogs.com/tclan126/p/8443176.html
Copyright © 2011-2022 走看看