Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-12-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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);
}
Uso:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Text = file_hex("C:\\Windows\\notepad.exe", 95, 20);
}
Ahora a la función se le envían como argumentos, la posición inicial (basada en cero) y la cantidad de elementos a leer a partir de ella.

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.
Responder Con Cita
  #2  
Antiguo 09-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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;
}
El resultado lo devuelve en otro buffer de tamaño mínimo 2*BinSize + 4
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.
Responder Con Cita
  #3  
Antiguo 10-12-2013
andres_89 andres_89 is offline
Miembro
 
Registrado: dic 2013
Posts: 46
Poder: 0
andres_89 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 10-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
[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)
Ahora en Str tenemos una cadena ASCIIZ con un retorno de carro y línea al final y que contiene Data convertido a hexadecimal.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 22:46:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi