Febrero 25, 2018, 12:06:53 am

Autor Tema: Coder de Hexadecimal en C++  (Leído 3986 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Coder de Hexadecimal en C++
« en: Agosto 20, 2010, 03:41:54 am »
Hola estoy intentando hacer un decodificador de Hexadecimal  para codificar/decodificar ficheros binarios.

Pero  me entra muchas dudas, sobre todo al hacer una tabla para decodificar.

Pongo mi códificador:
Código: You are not allowed to view links. Register or Login
#include <iostream>
#include <fstream>
using namespace std;
char alfa_hex[] = { "0123456789ABCDEF" };
char convert_block(char buf){
int c = (buf & 0x0f); //     10101010 & 00001111 =>  00001010
int d = (buf & 0xf0) >> 4; //     10101010 & 11110000 -> 10100000 >> 4 =  00001010
cout << alfa_hex[c] << alfa_hex[d];
}
void convert_hex(std::string& f){
ifstream is(f.c_str(),ios::binary);
if( !is ) {
cerr << "error al abrir" << f;
return;
}
char c;
while (is.good()){
c = is.get();
if (is.good()){
char hex = convert_block(c);
}
}
}

Ahora viene mi duda , ya que codificar lo veo fácil , pero decodificar no tanto. Así que voy a explicar como estoy construyendo el decodificador de Hexadecimal a Ascii.

Al igual que antes abro un fichero en modo binario (isfstream is)  y lo recorro:

Código: You are not allowed to view links. Register or Login
vector<char> buffer;
while (is.good()){
char c = is.get();
if (is.good()){
buffer.push_back(c);
}
if( buffer.size() == 2 ){
cout << decode_block(buffer);
buffer.clear();
}
}

ahora en decode block vienen mis dudas
Código: You are not allowed to view links. Register or Login
int decode_block(vector<char>& v){
int n = 0;
if( v.size() == 2 ){
int bin =  (  (v[0] & 0x00FF) << 16 ) | ( v[1] & 0x00FF) ;
//---- aqui es donde me surgen los fallos y las dudas
//  return tabla_dec_hex[ bin ] se que es una tabla ¿pero que tabla ?
return bin;
}
cerr << endl <<  "*** ERROR: tienen que ser 2 caracteres ***" << endl;
exit(1);
}

Ahora la cuestión es la  tabla a utilizar y como construirla es lo que me da de pensar , ya que  si hago una traducción de código Ascii  me suena un poco raro  y antes de ponerme a programar como un loco quiero ver si me falla algún concepto , que es lo más seguro.

¿la solución sería construirme una tabla como la de You are not allowed to view links. Register or Login ,es decir  desde 00 a 7F con todos los posibles valores ?

¿Eso me decodificaría correctamente?

Muchas gracias a todos de antemano.




 
« Última modificación: Agosto 30, 2010, 05:09:34 am por erjaimer »
No es el conocimiento, sino el acto de aprendizaje, y no la posesión, sino el acto de llegar allí, que concede el mayor disfrute.

Carl Friedrich Gauss
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado .xAk.

  • el engendro
  • Moderador
  • *****
  • Mensajes: 7308
  • Sexo: Masculino
  • F0r3v3R NeWbI3
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #1 en: Agosto 20, 2010, 07:07:04 am »
mmm, pero hexadecimal es un número, cualquier caracter es un número, y puedes presentarlo en octal, decimal o hexadecimal.

Mírate esto: You are not allowed to view links. Register or Login (está en C estandar)

SaludOS
Is the truth out there?

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #2 en: Agosto 21, 2010, 02:51:39 am »
Pero lo que quiero es convertir de Hexadecimal en binario es decir si tengo un fichero de este formato

A2FF2345FF.....   ( este fichero es un ejecutable de windows, un mp4 , un doc  ,  es un pdf etc ) cuando pase por mi decodificador se convierta a su formato original .


Un saludo.

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #3 en: Agosto 22, 2010, 05:20:26 pm »
No se si a lo mejor me he explicado mal , pero he llegado a una solución y quiero compartirla con ustedes:

lo primero es que para decodificar un fichero  en formato hexadecimal:  686f......
he usado un decodificador de la siguiente manera, usando para ello un map de char y entero.
Código: You are not allowed to view links. Register or Login
map_decode_hex['0'] = 0x0;
map_decode_hex['1'] = 0x1;
map_decode_hex['2'] = 0x2;
map_decode_hex['3'] = 0x3;
map_decode_hex['4'] = 0x4;
map_decode_hex['5'] = 0x5;
map_decode_hex['6'] = 0x6;
map_decode_hex['7'] = 0x7;
map_decode_hex['8'] = 0x8;
map_decode_hex['9'] = 0x9;
map_decode_hex['a'] = 0x0a;
map_decode_hex['b'] = 0x0b;
map_decode_hex['c'] = 0x0c;
map_decode_hex['d'] = 0x0d;
map_decode_hex['e'] = 0x0e;
map_decode_hex['f'] = 0x0f;

Quedando la funcion de decodificar un bloque ( tengamos en cuenta que cada 2 char de este fichero será un entero de 8 bits y habrá que pillarlos de dos en dos:

Código: You are not allowed to view links. Register or Login
char decode_block(vector<char>& v){
if( v.size() == 2 ){

int c =   (  map_decode_hex[   v[0]   ] & 0xF ) << 4 ;
int d = map_decode_hex[v[1]] ;
return c | d;
}
cerr << endl <<  "*** ERROR: tienen que ser 2 caracteres ***" << endl;
exit(1);
}

Muchas gracias a AnimAlf  por contestarme , la verdad tu contestación me dio alguna pista para encontrar mi solución.

Pero con ficheros de tipo ejecutable no me funciona , ( solo con texto )
 
¿Alguna pista o solución?


Desconectado flony

  • Me das tu password?
  • **
  • Mensajes: 253
  • Sexo: Masculino
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #4 en: Agosto 22, 2010, 07:55:45 pm »
no soy muy ducho en el tema pero en esta pagina puede haber algo que les intereses
You are not allowed to view links. Register or Login
si un problema no tiene solucion entonces no es un problema...es algo inevitable

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #5 en: Agosto 24, 2010, 08:17:44 am »
No pero eso no me vale ten en cuenta que

Código: You are not allowed to view links. Register or Login
  cout << hex << 'F' << endl;

Esta forma no sirve para codificar un fichero en modo binario ,me da errores.

Pero yo quiero exactamente el caso contrario de un char que representa un Hexadecimal obtener su valor binario , de manera que si esta codificado  un ejecutable así poder decodificarlo sin problemas.

De todas formas me ha parecido muy interesante tu enlace y te lo agradezco. Pero no soy capaz de decodificar un binario  codificado en Hexadecimal , usando mi codificador.

Un saludo.

Desconectado .xAk.

  • el engendro
  • Moderador
  • *****
  • Mensajes: 7308
  • Sexo: Masculino
  • F0r3v3R NeWbI3
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #6 en: Agosto 24, 2010, 08:42:23 am »
No lies. Quieres conseguirlo con tu función, me parece muy bien. Pero me repito. Es un número no te hace falta formula alguna, más que leer y escribir los que quieras.

SaludOS

Desconectado jep

  • Night Elf Druid
  • Colaborador
  • ****
  • Mensajes: 1771
  • Sexo: Masculino
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #7 en: Agosto 24, 2010, 09:06:59 am »
  cout << hex << 'F' << endl;
[/code]

Esta forma no sirve para codificar un fichero en modo binario ,me da errores.

Pero yo quiero exactamente el caso contrario de un char que representa un Hexadecimal obtener su valor binario , de manera que si esta codificado  un ejecutable así poder decodificarlo sin problemas.

De todas formas me ha parecido muy interesante tu enlace y te lo agradezco. Pero no soy capaz de decodificar un binario  codificado en Hexadecimal , usando mi codificador.

Un saludo.

creo que antes de tratar de hacer esto debes tener mas en claro algunas cosas.
un fichero binario es lo mismo que uno en hexa, realmente siempre estan en binario, todo siempre esta en binario.
pero se leen los numeros de a 8 bits, y eso representa un numero, ese numero lo podes imprimir como quieras, en binario, hexa, decimal o con su representacion en ASCII

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #8 en: Agosto 25, 2010, 01:59:18 am »
exacto, pero ten en cuenta que lo que quiero es coger un fichero y encriptarlo es decir imaginemos que tenemos un fichero , un doc por ejemplo una vez que lo pasamos a hexadecimal  ( es decir por el codificador ) tengo un fichero de "texto" de la siguiente manera:
Código: You are not allowed to view links. Register or Login
AB 89 FF .....
de acuerdo ahora ese doc que ha sido pasado a "texto" y almacenado en un fichero o en un char *   ,  quiero hacer el proceso contrario es decir convertirlo a su estado original,   conviertiendo "AB"  al valor que le corresponda,

Pero claro quizas me falte algo de base, por que ahora que pienso puede que ciertos valores en Hexadecimal se  sobrepasen su rango en Ascii.

¿Alguna idea ?

Desconectado SEKTOR

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 1551
  • Sexo: Masculino
  • ๑۩۞۩๑ Mortal Kombat World Champion ๑۩۞۩๑
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #9 en: Agosto 25, 2010, 03:25:25 am »
tu proyecto es un encriptador/desencriptador en hexadecimal.

por que no lo haces tipo "diccionario"?

que tu protocolo de encriptacion sea el codigo ascii/hexadecimal y viceversa.

tipo diccionario es:


encriptador

Palabra: papa

Código: (cpp) You are not allowed to view links. Register or Login
if (character1 =='p')
70  //cambio por caracter hexadecimal

if (caracter2== 'a')
61  //cambio por caracter hexadecimal

y asi sucesivamente, lo puedes hacer con un for ( ó varios).

//cadena resultante en hexadecimal= 70:61:70:61
//cadena original en ascii= papa

// para desencriptarlo ahora es revertir la encriptacion

if (caracteres1y2 ==70)
'p' //cambio por caracter ascii

if (caracteres2y3==61)
'a'  //cambio por caracter ascii

//cadena resultante en ascii= papa
// cadena encriptada en hexadecimal = 70:61:70:61


tipo diccionario es, que tu ya conoces que caracteres vas a suplir  por los de la cadena.

el algoritmo que necesitas, tiene que ir captando o recibiendo la cadena de texto a encriptar.

y en ese mismo proceso ir supliendo los caracteres ascii por los hexadecimales "que tu ya conoces".

los numeros hexadecimales los puedes guardar en un vector de dimensiones (diccionario).

el vector[][10]={"20","21","22" ,"23","24"}; //hexadecimal

comienzan en el 20 los numeros hexadecimales imprimibles.

y terminan en el 127.

You are not allowed to view links. Register or Login




otro ejemplo de la salida en pantalla de el numero 47
Código: You are not allowed to view links. Register or Login
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    char a;
    int h=47;
    a=h;   // le asigno el numero 47 a la variable "a"
    cout<<47<<" = numero 47 en decimal"<<endl;
    cout<<hex<<47<<" = numero 47 en hexadecimal"<<endl;
    cout<<a<<"  = numero 47 en ASCII"<<endl;

  getchar();
    return EXIT_SUCCESS;
}

salida:

47 = numero 47 en decimal
2f  = numero 47 en hexadecimal
/    = numero 47 en ascii


saluOX
« Última modificación: Agosto 25, 2010, 03:34:07 am por SEKTOR »

Desconectado .xAk.

  • el engendro
  • Moderador
  • *****
  • Mensajes: 7308
  • Sexo: Masculino
  • F0r3v3R NeWbI3
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #10 en: Agosto 25, 2010, 04:32:04 am »

¿Me entendiste con las funciones? la tienes de más no te hacen falta.

Abres el archivo, lees caracter a caracter y escribes en cada caracter con notación hexadecimal.

Creo que ha quedado claro en las diferentes respuestas cómo hacerlo sin función.

El caso contrario, igual. Tienes dos dígitos, separados por espacio en el archivo de texto que creaste.

Sólo tienes que añadire 0x y trabajar con cada uno. Por el ejemplo, el 47 del mensaje anterior que hemos quedado que es 2f en hexa y / como char sería:

Código: (cpp) You are not allowed to view links. Register or Login
#include <iostream>

int main ()
{
std::cout << dec << 0x2f << std::endl;
std::cout << ( char ) 0x2f << std::endl;
return 0;
}

SaludOS
« Última modificación: Agosto 25, 2010, 04:32:41 am por AnimAlf »

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #11 en: Agosto 25, 2010, 11:45:53 am »
Muchas gracias por todo , Me habéis ayudado a ser un poquito menos tonto, acabo de publicar este pequeño proyecto en el sourceforge:

       You are not allowed to view links. Register or Login

Todavía tengo que pulir un poco el código y la documentación, pero por supuesto , todos lo que me han ayudado han sido mencionados incluido este gran portal.

Al final he seguido el consejo de AninAlf.

Un saludo a tod@s
« Última modificación: Agosto 25, 2010, 11:46:59 am por erjaimer »

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #12 en: Agosto 29, 2010, 03:35:40 pm »
bueno pongo este tema como solucionado

Un saludo.

Desconectado jbgg

  • Me das tu IP?
  • *
  • Mensajes: 85
  • Sexo: Masculino
    • Ver Perfil
Re: Coder de Hexadecimal en C++
« Respuesta #13 en: Agosto 29, 2010, 04:04:16 pm »
Para que se vea este icono tienes que modificarlo en el primer mensaje que escribiste.

Desconectado erjaimer

  • Me das tu IP?
  • *
  • Mensajes: 79
  • Sexo: Masculino
    • Ver Perfil
    • El blog de erjaimer
Re: Coder de Hexadecimal en C++
« Respuesta #14 en: Agosto 30, 2010, 05:09:09 am »
gracias perdón , antes , me leeré las normas para editar.

Un saludo y gracias.


xx
Enigma Coder - El mejor programa de codificacion (Basado en tecnicas militares)

Iniciado por Jonh Limon

4 Respuestas
1026 Vistas
Último mensaje Abril 03, 2009, 12:23:09 pm
por Jonh Limon
xx
Convertir Hexadecimal a RGB con PHP

Iniciado por shevchenko

0 Respuestas
2239 Vistas
Último mensaje Agosto 14, 2008, 09:44:49 am
por shevchenko
question
De hexadecimal a Opcode

Iniciado por Hatake

0 Respuestas
948 Vistas
Último mensaje Agosto 26, 2009, 10:41:57 pm
por Hatake
question
Hexadecimal a decimal?

Iniciado por bolivianito

7 Respuestas
3445 Vistas
Último mensaje Agosto 17, 2010, 07:05:56 am
por bolivianito
resuelto
De hexadecimal a ascii

Iniciado por joaquin.a

7 Respuestas
2801 Vistas
Último mensaje Enero 09, 2012, 04:56:47 pm
por Khan-BG
xx
Conversor hexadecimal

Iniciado por gryphes

9 Respuestas
796 Vistas
Último mensaje ſeptiembre 26, 2009, 04:03:15 am
por .:.IlcOn14.:.
exclamation
Decimal 2 Hexadecimal

Iniciado por cic0

5 Respuestas
2498 Vistas
Último mensaje Marzo 29, 2011, 04:57:15 pm
por Khan-BG
question
Editor Hexadecimal

Iniciado por Ike Array

2 Respuestas
675 Vistas
Último mensaje Julio 15, 2011, 06:04:08 pm
por mDrinky
question
problema con wep key hexadecimal

Iniciado por comcom.com

2 Respuestas
936 Vistas
Último mensaje Octubre 15, 2013, 02:45:25 pm
por comcom.com
xx
Conversion hexadecimal

Iniciado por metroix

4 Respuestas
1331 Vistas
Último mensaje Mayo 29, 2007, 08:54:34 pm
por DarkKey