c/c++语言 8字符与ASCII码互转

167 阅读1分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

让8位字符与数字互转,但因编译器的限制,switch里面单引号中只能放进8个字符, 同时也可以把这8个字符转换为数字,或者数字转回去字符。

下面是一个测试样例的代码

#include<stdio.h>
#include<string.h>
static char ASCII[97]=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
char*subString(const char*c,int i,int e){
  char*w=(char*)malloc(sizeof(char)*(e-i));int p = 0;for(;i<e;)w[p++]=c[i++];w[p]='\0';return w;
}
int strLen(const char*s){const char*e=s;while(*s!='\0')++s;return s-e;}
unsigned long long from_str(const char*oid){int i=strLen(oid),j;
  unsigned long long this=0,pow_256=1;
  while (i-->0){
    char*chr=subString(oid,i,i+1);j=0;
    while (j++<97){
      char*s=subString(ASCII,j-1,j);
      if(strcmp(chr,s)==0){
        this=this+(j+31)*pow_256;
        pow_256=pow_256*256;free(s);break;
      }
      free(s);
    }
    free(chr);
  }
  return this;
}
char*to_str(unsigned long long i){
  int z=2;for(unsigned long long a=i;a>127;a-=127,a/=256,++z);
  unsigned long long b,t=i/0x100;b=i-t*0x100-32;
  char*w=(char*)malloc(sizeof(char)*z);w[--z]='\0';
  while(t>127){
    w[--z]=ASCII[b];i=t;t=i/0x100;b=i-t*0x100-32;
  }
  w[--z]=ASCII[b];if(z>0){t-=32;w[0]=ASCII[t];}
  return w;
}
unsigned long long fromStr(const char*s){
  unsigned long long r=0;for(int i=0;s[i]!='\0';r*=256,r+=s[i++]);return r;
}
int main(){
   char d[9];scanf("%s",&d);
   printf("%lld\n",from_str(d));
   printf("str->%s\n",to_str(fromStr(d)));
   return 0;
}