01: #include <stdlib.h> 02: #include <string.h> 03: 04: static const char *base="0123456789abcdef"; 05: 06: static const unsigned int ibase[]={ 07: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 08: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 09: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11: 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12: 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 13: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16: 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 17: 13, 14, 15}; 18: 19: char *uchar2hex(const unsigned char *in, size_t len) 20: { 21: char *out; 22: int i; 23: int l; 24: 25: l=sizeof(char)*len*2+1; 26: out=malloc(l); 27: out[l]='\0'; 28: for(i=0;i<len;i++) 29: { 30: int p; 31: int t; 32: 33: p=i*2; 34: t=in[i]; 35: out[p]=base[(t>>4)&0x0F]; 36: out[p+1]=base[t&0x0F]; 37: } 38: return out; 39: } 40: 41: unsigned char *hex2uchar(char *hexstr, size_t *len) 42: { 43: unsigned char *out; 44: int i; 45: int l; 46: 47: l=strlen(hexstr)/2; 48: out=malloc(sizeof(unsigned char)*l); 49: for(i=0;i<l;i++) 50: { 51: int p; 52: 53: p=i*2; 54: out[i]=(unsigned char)((ibase[hexstr[p]&0xEF]<<4)|(ibase[hexstr[p+1]&0xEF]&0xFF)); 55: } 56: *len=l; 57: return out; 58: } 59:
Explicacion:
04-04: Caracteres validos en hexadecimal, ordenados convenientemente
06-17: Arreglo que sirve para invertir el proceso, convirtiendo un caracter hexadeximal en binario
19-39: Funcion que codifica la informacion binaria en una cadena hexadecimal, la longitud de la informacion binaria, esta indicada por len.
41-58: Funcion que extrae la informacion binaria de una cadena hexadecimal, la longitud resultante se almacenara en la direccion de len.
Optimizacion:
- Se construye el arreglo resultante con la logitud exacta necesaria
- Se emplean arreglos, para minimizar el numero de operaciones
- Los valores regresados por estas funciones, se deben liberar con la funcion free, pues se aloja memoria con malloc
- En esta version, solo es posible usar minusculas
No hay comentarios.:
Publicar un comentario