Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   El tamaño de un Fichero (https://www.clubdelphi.com/foros/showthread.php?t=53801)

JoseFco 01-03-2008 02:40:30

El tamaño de un Fichero
 
Hola Amigos.

Existe alguna forma de que Delphi al cargar un file nos permita saber el size del mismo?.El formato de este file es un (intelHex.)


Un Saludo.

dec 01-03-2008 03:22:36

Hola,

Hum... ¿estamos hablando de averiguar el tamaño de un archivo?

JoseFco 02-03-2008 01:01:50

Hola dec.

Me temo que es mas complicado que eso.No es en si el tamaño del file, en realidad es el size de los bytes que este file contiene y que son data a programar.
Para explicarme mejor intelhex. este enlace nos deja ver mejor el formato de este tipo de files.En la penultima linea esta la informacion que tendria que manipular.En el primer hex de esta linea esta la cantidad de bytes de data que contiene y en los dos bytes que le siguen esta el address donde esta data comenzara.Si el primer hex de esa linea es 03 entonces sabremos que el address final donde terminara el size del file de programacion es ese address mas dos espacios mas . jajajajajajajaja algo complicado.
La idea del porque quiero saber el size de este tipo de file es para saber de ante mano antes de mandar un file a un chip si este tiene la capacidad de cargarlo, antes de dar la orden de hacerlo.

Un Saludo.

JoseFco 02-03-2008 01:26:01

Hola Amigos.

Bueno aportando mas informacion:

:080743004349474F4C2D694862

En esa linea de codigo intelhex (la penultima para ser mas especifico) Encontramos que el primer hex es 08 esto nos deja saber que son 8 los hex de data en la misma.Los hex 0743 nos dejan saber que estos 8 hex de data comensaran en el address 0743h donde el primero de ellos estara en esa address y los restantes 7 en adelante.Entonces tendriamos que el address final de ese file seria 074Ah. Teniendo en cuenta que 07FFh son 2 kbytes, entonces podemos decir que este file si cabe dentro de un chip que tengo 2 kbytes de memoria.Ya que 074A < 07FF.
La clave de lo que trato de encontrar estaria entonces como digo en la penultima linea de este tipo de files y para ser mas exactos en sus primeros tres bytes.

Un Saludo.

ixMike 02-03-2008 01:34:41

Veamos si me sale...

Código Delphi [-]
function IntelHexFileSize(FileName: string): integer;
var
 F: File of byte;
 HexCount, A1, A2: Byte;
 Adress: Word;
begin
AssignFile(FileName, F);
Reset(F);
Read(F, HexCount);
Read(F, A1);
Read(F, A2);
CloseFile(F);
Adress:=HexToInt(IntToHex(A1,2)+IntToHex(A2,2));
Result:=Adress+HexCount;
end;

Necestirás la función HexToInt: Trucomanía

Está hecho así, de cabeza, no sé si funcionará bien... de todas formas, ¿no te vale un FileSize de un archivo de tipo Byte?:confused:


Salu2. :)

JoseFco 02-03-2008 03:19:50

Hola ixMike.

Gracias por la ayuda que me puedas dar en este hilo.Pondre un file intelhex corto para ver si me puedes ayudar a encontrar una forma de poder contar los bytes de data que en realidad tiene.

[codigo]
:020000000149B4
:0100030032CA
:01000B0032C2
:0100130032BA
:01001B0032B2
:0100230032AA
:1800250075880075890075D00075A800227F000FEFB4FFFB227E007DFC
:14003D00020E1132EE70FA1DED70F6221125B290113A014B63
:00000001FF
[/codigo]

Este file intelhex tiene 9 lineas pero en realidad solo 8 tienen bytes de data a programar en un micro.
Si vemos el primer hex de cada linea despues del semicolon ( : ) y lo pasamos a decimal nos dara los bytes de data en esa linea y asi los podemos sumar con los de la linea dos,tres, etc. En este caso en la primera linea hay solo dos bytes de data a programar ya que es :02 y en la segunda solo uno :01

Mi pregunta se puede hacer una funcion en Delphi que solo cuente en cada linea despues del semicolon el hex que le sigue y sumarlo al siguiente de la siguiente linea ?

Un Saludo.

ixMike 02-03-2008 03:39:04

Pero, ¿cómo son estos archivos? ¿Archivos de texto, tal cual los expones? ¿Series de bytes? Y si es así, ¿cómo se estructuran?

Poderse se puede, sólo hay saber cómo.


Por cierto, semicolon es puntocoma ";". Los ":" se dice.... bueno, no sé cómo se dice dos puntos :D

Lepe 02-03-2008 03:53:04

Cita:

Empezado por ixMike (Mensaje 270045)
Los ":" se dice.... bueno, no sé cómo se dice dos puntos :D

se dice "dos puntos". Porque hablamos español, si started to hablar half en inglés mitad en spanish, pues vaya foro de frikies ¿no?

PD: yo tampoco sé como se dice en inglés los dos puntos :D :D

Saludos

JoseFco 02-03-2008 03:57:38

Un file intelhex es asi como lo estas mirando en mi comentario anterior.Estos files se usan para programar chips como los eproms y los microcontroladores.
Para entender este formato aqui el enlace.
Son dos puntos los que comienzan cada linea del mismo : uno de estos files puede ser de 5 kbytes pero la data real que entrara a un micro de estos 5 kbytes pueden ser 2 kbytes.El resto son bytes de address, intruciones, etc.
Este tipo de file no es complicado una vez que ya uno lo puede entender.Mi problema no es con este codigo, mi problema es Delphi que no lo domino.Yo mirando la penultima linea de un file intelhex en unos segundos te digo cuantos bytes de data contiene este file.
El problema radica en que quiero que una rutina en Delphi lo pueda hacer( contar los bytes de data reales que contiene un file determinado.)

Un Saludo.

ixMike 02-03-2008 13:45:32

Entonces, a ver si lo he entendido.

Son archivos de texto. Y en este ejemplo:

Cita:

:020000000149B4
:0100030032CA
:01000B0032C2
:0100130032BA
:01001B0032B2
:0100230032AA
:1800250075880075890075D00075A800227F000FEFB4FFFB227E007DFC
:14003D00020E1132EE70FA1DED70F6221125B290113A014B63
el archivo resultante para el chip ocuparía 2+1+1+1+1+1+24+20 = 51 bytes, ¿no?

JoseFco 02-03-2008 14:44:24

Cita:

Empezado por ixMike (Mensaje 270072)
Entonces, a ver si lo he entendido.

Son archivos de texto. Y en este ejemplo:



el archivo resultante para el chip ocuparía 2+1+1+1+1+1+24+20 = 51 bytes, ¿no?

Si eso es correcto y esos 51 bytes resultante son los que al final conformaran el file que terminara dentro del micro. Por eso la importancia de conocer su tamaño.

Un Saludo.

ixMike 02-03-2008 15:13:11

Vale. Entonces, suponiendo que esa última línea :00000001FF no afecta (¿siempre es :00....?) entonces creo que este código te sirve:

Código Delphi [-]
Function IntelHexFinalFileSize(const FileName: String): Integer;
var
 S: TStrings;
 n, FinalSize: Integer;
begin
 FinalSize:=0;
 S:=TStringList.Create;
 S.LoadFromFile(FileName);
 For n:=0 to S.Count-1 do Inc(FinalSize, HexToInt(Copy(S[n],2,2)));
 S.Free;
 Result:=FinalSize;
end;


Lo único que hace es recorrer todas las líneas del fichero, sumando los valores iniciales de cada línea.

¿Fácil, no? ¿Qué es lo que no sabías hacer? ¿Leer el archivo de texto? ¿Obtener los valores de cada línea? ¿Sumar valores hexadecimales?...


Salu2 :)

JoseFco 02-03-2008 16:16:33

Hola ixMike.

Cita:

¿Qué es lo que no sabías hacer? ¿Leer el archivo de texto? ¿Obtener los valores de cada línea?
Mas bien que es lo que no se todavia. jajajajajaja en esto de Delphi estoy a gatas todavia.
Con ese codigo tengo material de estudio para un rato.:D:D:D

Un Saludo y un millon de gracias.

JoseFco 02-03-2008 19:27:11

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
 function HextoInt(HexStr: String):integer;
const Hex : array['A'..'F'] of integer = (10,11,12,13,14,15);
var
    i   : integer;
begin
  Result:=0;
  for i := 1 to Length(HexStr) do
    if HexStr[i] < 'A' then Result := Result * 16 + Ord(HexStr[i]) - 48
                       else Result := Result * 16 + Hex[HexStr[i]];
end;
Function IntelHexFinalFileSize(const FileName: String): Integer;
var
 S: TStrings;
 n, FinalSize: Integer;
begin
 FinalSize:=0;
 S:=TStringList.Create;
 S.LoadFromFile(FileName);
 For n:=0 to S.Count-1 do Inc(FinalSize, HexToInt(Copy(S[n],2,2)));
 S.Free;
 Result:=FinalSize;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
  begin
  Label1.Caption:=OpenDialog1.FileName;
  Memo1.Lines.LoadFromFile(Label1.Caption);
  Label2.Caption:=IntToStr(IntelHexFinalFileSize(Label1.Caption));
end;
end;
end.

Gracias al amigo ixMike asunto resuelto.:):p:D

Caral 02-03-2008 19:46:41

Hola
He seguido el hilo y solo puedo decir, muy interesante aunque no se para que sirve.:D
Saludos

JoseFco 02-03-2008 20:07:31

Hola Caral.

La idea es poder contar los bytes de programa (bytes que nadara a un micro) que contiene un file intelhex determinado.Ya que este es el tipo de file que se usa para programar un micro usando una PC.El file en si es mucho mas grande de los bytes que al final estaran dentro del chip.En este tipo de formato estan algunas instrucines y las address a donde estaran apuntando estos bytes de data.La importancia de saber cual es el tamaño real que iria a parar dentro del chip , es para determinar si el chip tiene memoria para el tamaño del file.;)
Por ejemplo el AT89C2051 solo tiene 2 kbytes de memoria y solo se podran mandar files que contengan 2 kbytes o menos.
Ahora yo con esa informacion comparo la memoria del chip que usare y el tamaño del file si esta dentro de los parametros todo continua normal de ser mayor entonces un Showmessage(' File es mas grande que la memoria');
algo asi.

Espero que ya este mas claro.

Un Saludo.

Caral 02-03-2008 20:18:12

Hola
Gracias por la explicación, trato de leer los hilos en los que participas ya que se que van relacionados con los chips y esas cosas.
Me pregunto?.
Como haces para leer el chip, lo pones en una usb, en otro ordenador?, no me queda claro.
No te preocupes en explicarme mucho, ya se que no le llegare, es solo curiosidad.
Saludos

eduarcol 02-03-2008 20:18:25

un gusto en saludarte amigo Jose, pero has perdido tu tiempo explicando eso a Caral, el ya lo sabia, solo pregunto para aumentar un post y ver si desvirtuaba el hilo ;), mira que por eso tiene mas de 3K en su cuenta :D:D

Caral 02-03-2008 20:23:40

Hola
Mira que eres camorrero.:D:D
No me hagas quedar mal, sabes que de esto no se nada y la verdad es muy interesante.
Saludos

eduarcol 02-03-2008 20:27:06

Ta bien, me retracto de mi comentario anterior, mira que seria interesante aprendieras un poco y automatizaras tus procesos en produccion, seria todo un exito.


La franja horaria es GMT +2. Ahora son las 11:20:46.

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