zoukankan      html  css  js  c++  java
  • 字符串和16进制字符串的相互转化

    我们在工作中,有时候会需要将字符串转化为16进制字符串给用户,因为ASCII中有些字符,当我们使用printf("%s",p_ch);输出时会杂乱无章,如果采用16进制,会好很多。

    因此编写程序,代码如下:

    #include <stdio.h>
    #include <string.h>
    
    int strToHex(char *ch, char *hex);
    int hexToStr(char *hex, char *ch);
    int hexCharToValue(const char ch);
    char valueToHexCh(const int value);
    int main(int argc, char *argv[])
    {
        char ch[1024];
        char hex[1024];
        char result[1024];
        char *p_ch = ch;
        char *p_hex = hex;
        char *p_result = result;
        printf("please input the string:");
        scanf("%s",p_ch);
    
        strToHex(p_ch,p_hex);
        printf("the hex is:%s
    ",p_hex);
        hexToStr(p_hex, p_result);
        printf("the string is:%s
    ", p_result);
        return 0;
    }
    
    int strToHex(char *ch, char *hex)
    {
      int high,low;
      int tmp = 0;
      if(ch == NULL || hex == NULL){
        return -1;
      }
    
      if(strlen(ch) == 0){
        return -2;
      }
    
      while(*ch){
        tmp = (int)*ch;
        high = tmp >> 4;
        low = tmp & 15;
        *hex++ = valueToHexCh(high); //先写高字节
        *hex++ = valueToHexCh(low); //其次写低字节
        ch++;
      }
      *hex = '';
      return 0;
    }
    
    int hexToStr(char *hex, char *ch)
    {
      int high,low;
      int tmp = 0;
      if(hex == NULL || ch == NULL){
        return -1;
      }
    
      if(strlen(hex) %2 == 1){
        return -2;
      }
    
      while(*hex){
        high = hexCharToValue(*hex);
        if(high < 0){
          *ch = '';
          return -3;
        }
        hex++; //指针移动到下一个字符上
        low = hexCharToValue(*hex);
        if(low < 0){
          *ch = '';
          return -3;
        }
        tmp = (high << 4) + low;
        *ch++ = (char)tmp;
        hex++;
      }
      *ch = '';
      return 0;
    }
    
    int hexCharToValue(const char ch){
      int result = 0;
      //获取16进制的高字节位数据
      if(ch >= '0' && ch <= '9'){
        result = (int)(ch - '0');
      }
      else if(ch >= 'a' && ch <= 'z'){
        result = (int)(ch - 'a') + 10;
      }
      else if(ch >= 'A' && ch <= 'Z'){
        result = (int)(ch - 'A') + 10;
      }
      else{
        result = -1;
      }
      return result;
    }
    
    char valueToHexCh(const int value)
    {
      char result = '';
      if(value >= 0 && value <= 9){
        result = (char)(value + 48); //48为ascii编码的‘0’字符编码值
      }
      else if(value >= 10 && value <= 15){
        result = (char)(value - 10 + 65); //减去10则找出其在16进制的偏移量,65为ascii的'A'的字符编码值
      }
      else{
        ;
      }
    
      return result;
    }
  • 相关阅读:
    红蓝对抗之Windows内网渗透
    [框架漏洞]Thinkphp系列漏洞【截至2020-07-20】
    xss
    OWASP TOP 10 详解
    关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),encodeURI(),encodeURIComponent()
    用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)
    批处理(.bat)简单应用实例
    线状地物图斑化全流程作业(使用ArcMap软件)
    VS Code Remote配置
    二分查找
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4691968.html
Copyright © 2011-2022 走看看