⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bin2hex.c

📁 非常经典的加密算法
💻 C
字号:
/* Copyright 1999 Enhanced Software Technologies Inc. * All Rights Reserved * * Released under a BSD-style license. See file LICENSE for info. * * bin2hex.c: binary to hex conversions.  * * RCS CHANGE LOG * $Log: bin2hex.c,v $ * Revision 1.2  2000/04/05 22:09:19  eric * Daily checkin... * * Revision 1.1  2000/03/28 23:54:28  eric * Initial checkin -- aescrypt/aesget * * Revision 1.4  1999/12/20 14:51:53  eric * Added dstring.h to headers list. * * Revision 1.3  1999/11/18 16:23:36  eric * More mods to make it work. Start of the 'rsh' functionality. * * Revision 1.2  1999/09/30 20:32:28  eric * Refreshed after Richard foobared the CVS archive * * Revision 1.1  1999/09/23 00:09:34  eric * Initial checkin * * * $Date: 2000/04/05 22:09:19 $ *//* #define DEBUG 1 */#include <string.h>#include <stdio.h>#include <stdlib.h>#include "dstring.h"static char HEXSTR[]="0123456789ABCDEF";unsigned int unhexnib(unsigned char hexchar) {  if (hexchar>='0' && hexchar <='9') {    return hexchar-'0';  }  if (hexchar>='A' && hexchar <='F') {    return hexchar-'A'+10;  }  if (hexchar>='a' && hexchar <='f') {    return hexchar-'a'+10;  }  return -1; /* ERROR! */}/*************************************************************************** * STRAIGHT BIG_ENDIAN FUNCTIONS *************************************************************************** * These do not attempt to switch between big endian/little endian byte * order. We use these mostly when we are hexifying stuff that was * created by mpz_t or etc...  **************************************************************************/unsigned char *hexify_block( unsigned char *resultbuf, int length ) {  unsigned char *resultstr;  int i;  int leftnib;  int rightnib;  unsigned int ch;  resultstr= (unsigned char *)malloc(length*2+1);  /* 16 bytes * 2 + terminator */  /* if big endian, start at beginning & go up */  for (i=0;i<length;i++) {    ch=(unsigned int) *resultbuf++;    leftnib= (ch >> 4) & 0x0f ;    rightnib = ch & 0x0f;    resultstr[i*2]=HEXSTR[leftnib];    resultstr[i*2+1]=HEXSTR[rightnib];  }  resultstr[length*2]=0; /* terminate it! */  return resultstr;}  /* Okay, new design: unhexify_block was not working right :-(. Thus * here's what I am going to do: *  1) take the incoming hex string and massage it to the right length *  2) Do a straight left-to-right hex to decimal conversion! */unsigned char *unhexify_block(unsigned char *str, int length) {  unsigned char *source;  unsigned char *result;  int hexlen=length*2;  int len=strlen(str);  int i;  unsigned int ch;  int leftnib;  int rightnib;  /* Now to do it: */  result=(char *)malloc(length);    if (len < hexlen) {    source=d_lpad(str,'0',hexlen);  } else {    source=d_dup(str);    source[hexlen]=0; /* chop off the right hand side if needed! */  }#ifdef DEBUG  printf("hex2bin: length=%d, source='%s'\n",length,source);#endif  /* Now do straight left to right: */  for (i=0;i<length;i++) {    leftnib=unhexnib(source[i*2]);    rightnib=unhexnib(source[i*2+1]);    ch=(leftnib <<4) | rightnib;#ifdef DEBUGDEBUG    printf("hex2bin: ch[%d]=%x\n",i,ch);#endif    result[i]=(unsigned char) ch; /* voila! */  }    free(source);  /* Get rid of memory leak! */  /* and return! */  return result;}#ifdef FOOFOOFOO     unsigned char *unhexify_block(unsigned char *str, int length) {  unsigned char *source;  unsigned char *result;  int hexlen = length*2;  int i;    unsigned int ch;  int leftnib;  int rightnib;  unsigned char *resultwalk;  unsigned char *strwalk;  if (strlen(str) < hexlen) {    source=d_lpad(str,'0',hexlen);  } else {    source=d_dup(str);    }  /* now allocate our space: */   result=(char *) malloc(length); /* has to be that length, divided by two. */  memset(result,0,length);  /* We always do big_endian, meaning that we must start at the LSB and come   * backwards to make sure we don't leave trailing zeros.    */     resultwalk=result+length-1;  strwalk=str+strlen(str)-2;  for (i=0;i<length;i++) {    leftnib=unhexnib(*strwalk++);    rightnib=unhexnib(*strwalk--);    strwalk-=2; /* go to previous... */    ch=(leftnib << 4) | rightnib;    *resultwalk-- = (unsigned char) ch; /* and set it! */  }  return result;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -