![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#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. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|