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是规定了最小值,超过时阶段,不足时不填充

  • 相关阅读:
    实习感悟——从用户中来,到用户中去
    FineUI PK DWZ
    Java入门到精通——工具篇之Maven概述
    信息论的熵
    菜鸟学习Hibernate——一对多关系映射
    StyleCop学习笔记——默认的规则
    StyleCop学习笔记——自定义规则
    StyleCop学习笔记——初识StyleCop
    好博客收藏
    菜鸟学习Hibernate——简单的增、删、改、查操作
  • 原文地址:https://www.cnblogs.com/tclan126/p/8443176.html
Copyright © 2011-2022 走看看