FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Error con buffer
Buenas amigos, tengo un pequeño error al tratar de leer un ejecutable en hexadecimal, consigo leer la parte que quiero, pero al momento de volverlo a leer se va concatenando lo que leí al principio con lo que leo segundo, y lo que quisiera es que si vuelvo a leer me borre lo leído anteriormente, les dejo el código para ver donde cometo mi error:
Código:
void file_hex() { AnsiString str1,str2,hex,cadena_1,cadena_2,cadena; unsigned int length; unsigned char *buffer; char nombre_archivo[] = "prueba.exe"; ifstream archivo(nombre_archivo, ios::binary); if(archivo.fail()) cout << "Error al abrir el archivo " << nombre_archivo << endl; else { // obtener longitud del archivo archivo.seekg (0, ios::end); length = archivo.tellg(); archivo.seekg (0, ios::beg); // obtener memoria para la variable buffer = new unsigned char [length]; // leer datos como bloque archivo.read ((char*)(buffer),length); archivo.close(); // imprimir cada posicion del buffer como hexadecimal for (unsigned int i = 200; i < 216; i++) // for (unsigned int i = 384; i < 400; i++) //linea de codigo que solo quiero leer { if (buffer[i] < 16) { str1.printf("0%X", buffer[i]); strcat(cadena_1.c_str(),str1.c_str()); } else { str2.printf("%X", buffer[i]); strcat(cadena_2.c_str(),str2.c_str()); } } /* cadena.c_str() -> se almacena toda la cadena hexadecimal hex = cadena.c_str(); Form1->Edit1->Text = hex; delete[] buffer; // creo que acá esta el error, lo elimino pero igual se sigue quedando en el buffer. } } void __fastcall TForm1::Button1Click(TObject *Sender) { Edit1->Clear();//supuestamente borro la cadena mostrada en edit1. file_hex(); } gracias por las respuestas. |
#2
|
||||
|
||||
veo muchas cosas raras como que los valores los almacenas en cadena 1 y cadena2 pero luego no haces uso de ellos y si de cadena el cual no le has dado ningun valor. Otra cosa, en vez de Edit1->clear, prueba Edit1->text="".
|
#3
|
||||
|
||||
Hola andres_89.
Si estás usando C++ Builder de modo visual, en lugar de usar la librería estándar ifstream, te conviene aprovechar la VCL usando TFileStream, aquí hay algunos ejemplos: File Processing, buscando seguramente encontraras mas material. No sé si interpreté lo que queres hacer, pero te pongo un ejemplo acorde a lo que entendí: Código:
String file_hex(const String aFileName, const int LoPos, int HiPos) { TFileStream *fs = new TFileStream(aFileName, fmOpenRead); // abrir p/lectura unsigned char *buff = new unsigned char[fs->Size]; // tamaño buffer String str = ""; try { fs->Read(&buff, fs->Size-1); for (int i = LoPos; i <= HiPos; i++) str += IntToHex(buff[i], 2) + ' '; } __finally { delete[] buff; delete fs; } return str.SetLength(str.Length()-1); // quitar el último ' ' } Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { Edit1->Text = file_hex("C:\\Windows\\notepad.exe", 0, 20); } Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#4
|
|||
|
|||
Error ceros
Hola ecfisa,gracias por la opción al vlc, como dices mejor aprovecharla si ya se tiene,pero ejecute el código y probando con otros archivos y otras posiciones como (50,70), pero en todas me muestran :
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 , ya lo ejecute como administrador e igual me sigue mostrando ceros en cualquier posición. Saludos. |
#5
|
||||
|
||||
Tenes razón, disculpas.
Código:
String file_hex(const String aFileName, const int StartingAt, const int Quantity) { TFileStream *fs = new TFileStream(aFileName, fmOpenRead); unsigned char buff; String str = ""; try { fs->Seek(StartingAt, soFromBeginning); for(int i = 0; i < Quantity; i++) { fs->Read(&buff, 1); str += IntToHex(buff, 2) + ' '; } } __finally { delete fs; } return str.SetLength(str.Length()-1); } Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Text = file_hex("C:\\Windows\\notepad.exe", 95, 20); } Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 09-12-2013 a las 17:51:33. |
#6
|
||||
|
||||
Os propongo una función en Ansi C para convertir una cadena contenida en un buffer de tamaño conocido y no ASCIIZ (como el buffer obtenido de la lectura de un archivo de texto) en texto hexadecimal:
Código:
//--------------------------------------------------------------------------- // Convierte un buffer binario en una cadena de números hexadecimales bool BinToStr(BYTE *Bin, DWORD BinSize, char* Str, DWORD *StrSize) { if(!Str){ *StrSize = 2*BinSize + 4; // '\0' y dos caracteres de mas para el final en "\r\n" return false; } if(*StrSize < 2*BinSize + 4) return false; for(int i=0; i<BinSize; i++){ *Str = (0x0F & *Bin>>4) + 48; *(Str+1) = (0x0F & *Bin) + 48; if(*Str > '9') *Str += 7; if(*(Str+1) > '9') *(Str+1) += 7; Bin++; Str+=2; } *Str++ = '\r'; *Str++ = '\n'; *Str = 0; return true; } Si pasamos como argumento Str = NULL nos devuelve el tamaño del buffer necesario (2*BinSize + 4) Es una función que yo he usado para esos fines. Saludos. Última edición por escafandra fecha: 09-12-2013 a las 21:15:35. |
#7
|
|||
|
|||
Hexadecimal
Hola ecfisa y escafandra,
el código de ecfisa, me funciono correctamente pasandole como parámetro cualquier archivo, gracias. escafandra, tu código lo veo muy interesante, estoy analizando tu función ("bool BinToStr(BYTE *Bin, DWORD BinSize, char* Str, DWORD *StrSize)"), sinceramente no habia visto algunos códigos del Anci C que están en tu código....., bueno, una consulta estoy tratando de llamar tu función para leer un archivo como hexadecimal pero no logro a llamarla, encontre una forma de llamarla pero no me funciona: BINTOSTR(string, string_type) cuales serian sus parámetros? Saludos. |
#8
|
||||
|
||||
[code]bool BinToStr(BYTE *Bin, DWORD BinSize, char* Str, DWORD *StrSize) /CODE]
Bin: un puntero de tipo BYTE (char*) que apunta al buffer que contiene el binario a convertir a texto hexadecimal. BinSize: El tamaño del buffer anterior. Str: Un puntero tipo char* con un buffer que recibirá la salida del texto hexadecimal StrSize: un puntero tipo DWORD con el tamaño del buffer Str. Ejemplo Supongamos que lees un binario en un puntero BYTE *Data de tamaño Size: Código:
char *Str; // Puntero a un buffer que recibirá la cadena DWORD StrSize; // tamaño del buffer // Calculamos el tamaño de StrSize: BinToStr(Data, Size, 0, &StrSize); // reservamos memoria para Str Str = new char[StrSize); // Convertimos Data a hexadecimal BinToStr(Data, Size, Str, &StrSize); ... No olvidar liberar el buffer Str cuando no nos haga falta (delete [] Str) Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
solucion a Error Invalid blob handle in record buffer | memehua | Conexión con bases de datos | 2 | 26-09-2011 22:03:14 |
Eliminar Buffer TCP | jlsc | Varios | 2 | 16-06-2010 22:13:00 |
ERROR:ShLink.GetPath(Buffer, Sizeof(Buffer), Data, SLGP_UNCPRIORITY) | Mav | Varios | 2 | 26-05-2008 21:31:49 |
Bitmap buffer | fitolanga | Gráficos | 4 | 21-04-2007 15:58:29 |
Error Invalid blob handle in record buffer??? sin usar "Blobs to cache" | varuhs | Conexión con bases de datos | 4 | 22-01-2007 21:19:53 |
|