Ir al contenido


Foto

Problema Leyendo array of byte!


  • Por favor identifícate para responder
17 respuestas en este tema

#1 Djcheats

Djcheats

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 16 marzo 2011 - 12:27

hola Saludos ala Comunidad en estos dias he tenido un problemita  intetando leer un array of byte .  e Intentado con un for pero funciona mal.. les dejo mi codigo a ver si me dan una mano
 
 

delphi
  1.   var
  2.   MyArray:Array[1..5] of Byte = ($46, $6F, $72, $6D,$31);
  3.   s: byte;
  4.  
  5.  
  6.   begin
  7. for s := 0 to sizeof(MyArray) do
  8. begin
  9. for s := 0 to sizeof(MyArray) do
  10. if Pbyte($000000+s)^ = MyArray[s] then
  11. ShowMessage(' los 5 Bytes son correctos');
  12.  
  13.  
  14. end;
  15. end;
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  


funciona muy mal. lo que quiero es que si son los 5 bytes del array Lanze un Mensaje ojala me den una manita 
  • 0

#2 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 16 marzo 2011 - 12:39

Hola y bienvenido al foro, Djcheats:

Puesto que el array está definido desde 1 hasta 5, debes recorrerlo desde y hasta esos valores, según veo empiezas desde 0. Tampoco entiendo muy bien ese código, ya que parece que metes un for dentro de otro utilizando la misma variable (s) para recorrerlo, lo cual el compilador no te va a dejar.

Una forma de no equivocarnos en los valores inicial y final al recorrer un array, es hacer uso de las funciones Low y High, que devuelven el índice mínimo y máximo del array, respectivamente:



delphi
  1. for s:=Low(MyArray) to High(MyArray) do



Saludos

  • 0

#3 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 16 marzo 2011 - 12:48

Según lo que parece que quieres lograr, te aconsejo definir una variable Boolean que indique si son iguales, y en el momento en que alguno no lo sea, que salga del bucle:



delphi
  1. var
  2.   MyArray:Array[1..5] of Byte = ($46, $6F, $72, $6D,$31);
  3.   s: byte;
  4.   Iguales : Boolean;
  5. begin
  6.   Iguales := TRUE;
  7.   for s := Low(MyArray) to High(MyArray) do
  8.     if Pbyte($000000 + s)^ <> MyArray[s] then
  9.     begin
  10.       Iguales := FALSE;
  11.       break;
  12.     end;
  13.   if Iguales then ShowMessage(' los 5 Bytes son correctos')
  14.   else ShowMessage(' hay algún byte incorrecto');
  15. end;
  16. [/s]


  • 0

#4 Djcheats

Djcheats

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 16 marzo 2011 - 12:55

Hola y bienvenido al foro, Djcheats:

Puesto que el array está definido desde 1 hasta 5, debes recorrerlo desde y hasta esos valores, según veo empiezas desde 0. Tampoco entiendo muy bien ese código, ya que parece que metes un for dentro de otro utilizando la misma variable (s) para recorrerlo, lo cual el compilador no te va a dejar.

Una forma de no equivocarnos en los valores inicial y final al recorrer un array, es hacer uso de las funciones Low y High, que devuelven el índice mínimo y máximo del array, respectivamente:



delphi
  1. for s:=Low(MyArray) to High(MyArray) do



Saludos



el codigo funciona pero sigo teniendo el mismo problema. solo me lee el primer byte. del array y nos los 5 lo quiero hacer es que si los 5 bytes son Exactos enviar un mensaje.




Gracias.. por Responder.
  • 0

#5 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 16 marzo 2011 - 01:01

Hola

¿Probaste el código que te puse luego? Sólo debería salir del bucle si encuentra uno diferente, si son iguales no veo ningún motivo para que salga antes de hora 

Por cierto, cuando usas PByte($000000 + s), eso es un puntero ¿realmente sabes a qué dirección de memoria estás apuntando?
  • 0

#6 Djcheats

Djcheats

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 16 marzo 2011 - 01:11

Hola

¿Probaste el código que te puse luego? Sólo debería salir del bucle si encuentra uno diferente, si son iguales no veo ningún motivo para que salga antes de hora 



ha ha.. no me había fijado.. del código de arriba.


lo probé.. pero hay un problemas los 5 bytes son correctos y aun me sigue diciendo  que hay un byte incorrecto

pd:
que dolor de cabeza me tienen esos array xD!

  • 0

#7 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 16 marzo 2011 - 01:23

¿Has probado a recorrer paso a paso con el Debugger de Delphi a ver en cuál falla?

Como te dije en mi anterior mensaje, parece que estás comparando con valores almacenados en algún lugar (una matriz, una cadena ...) que no muestras en el código, habría que ver qué clase de estructura manejas. Revisando MyArray, veo esos valores hexadecimales equivalen a una cadena que dice "Form1", ése código que pusiste te sirve si estás comparando con otra cadena convencional, de toda la vida, donde cada caracter ocupa 1 Btyte, pero quizás la que estás leyendo venga en UNICODE (1, 2 ó 4 Bytes), en cuyo caso tendrás que abordarlo de otra forma ¿pudiera tener algo que ver?

Saludos
  • 0

#8 Djcheats

Djcheats

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 16 marzo 2011 - 01:29

¿Has probado a recorrer paso a paso con el Debugger de Delphi a ver en cuál falla?

Como te dije en mi anterior mensaje, parece que estás comparando con valores almacenados en algún lugar (una matriz, una cadena ...) que no muestras en el código, habría que ver qué clase de estructura manejas. Revisando MyArray, veo esos valores hexadecimales equivalen a una cadena que dice "Form1", ése código que pusiste te sirve si estás comparando con otra cadena convencional, de toda la vida, donde cada caracter ocupa 1 Btyte, pero quizás la que estás leyendo venga en UNICODE (1, 2 ó 4 Bytes), en cuyo caso tendrás que abordarlo de otra forma ¿pudiera tener algo que ver?

Saludos



sip.. estoy leyendo la Memoria de Mi Programa
Ejemplo.
el offset de Form1 es 009534F4 




delphi
  1. if Pbyte($009534F4+s)^ <> MyArray[s] then[/s]

[s]


quiero leer la Memoria si es = al array entonces enviar un mensaje.


  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 16 marzo 2011 - 01:34

Este código te sirve para probar:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. const
  3.   MyArray: Array [1 .. 5] of Byte = ($46, $6F, $72, $6D, $31);
  4. var
  5.   s,p: Byte;
  6. begin
  7.   for s := Low(MyArray) to High(MyArray) do
  8.   begin
  9.   P:= Pbyte($000000 + s)^ ;
  10.     if p <> MyArray[s] then
  11.     begin
  12.       ShowMessage('El byte -' + IntTostr(p) + '- es diferente de ' + IntTostr
  13.           (MyArray) + '-');
  14.       Exit;
  15.     end
  16.     else
  17.       ShowMessage(' los 5 Bytes son correctos')
  18.   end;
  19. end;
  20. [/s]



PD: Algunos caractéres del código se pierden al etiquetarlos en este caso algunas de  las llaves que encierran el índice del array.
  • 0

#10 Djcheats

Djcheats

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 16 marzo 2011 - 01:52

Este código te sirve para probar:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. const
  3.   MyArray: Array [1 .. 5] of Byte = ($46, $6F, $72, $6D, $31);
  4. var
  5.   s,p: Byte;
  6. begin
  7.   for s := Low(MyArray) to High(MyArray) do
  8.   begin
  9.   P:= Pbyte($000000 + s)^ ;
  10.     if p <> MyArray[s] then
  11.     begin
  12.       ShowMessage('El byte -' + IntTostr(p) + '- es diferente de ' + IntTostr
  13.           (MyArray) + '-');
  14.       Exit;
  15.     end
  16.     else
  17.       ShowMessage(' los 5 Bytes son correctos')
  18.   end;
  19. end;
  20. [/s]



PD: Algunos caractéres del código se pierden al etiquetarlos en este caso algunas de  las llaves que encierran el índice del array.



Gracias Amigo.. ando probando... y el mismo problema solo lee bien el primer Byte.. gracias por su ayuda!!
  • 0

#11 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 16 marzo 2011 - 04:03

Si usas delphi 2009 o superior, posiblemente la cadena "Form1" no este en ascii o ansi, mas bien en unicode como ya te apunto delphius.

En ese caso, cada codigo ocupa dos bytes, pero el sgundo va a estar vacio siempre porque esas letras son caracteres ascii y tienen codigos cortos a proposito. Por eso solo te lee bien el primero.

Yo probaria a leer uno de cada dos bytes del nombre del form a ver que ocurre:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. const
  3.   MyArray: Array [1 .. 5] of Byte = ($46, $6F, $72, $6D, $31);
  4. var
  5.   s,p: Byte;
  6. begin
  7.   for s := Low(MyArray) to High(MyArray) do
  8.   begin
  9.   P:= Pbyte($000000 + 2*s-1)^ ;
  10.     if p <> MyArray[s] then
  11.     begin
  12.       ShowMessage('El byte -' + IntTostr(p) + '- es diferente de ' + IntTostr
  13.           (MyArray) + '-');
  14.       Exit;
  15.     end
  16.     else
  17.       ShowMessage(' los 5 Bytes son correctos')
  18.   end;
  19. end;


  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 16 marzo 2011 - 08:08

Si usas delphi 2009 o superior, posiblemente la cadena "Form1" no este en ascii o ansi, mas bien en unicode como ya te apunto delphius.

En ese caso, cada codigo ocupa dos bytes, pero el sgundo va a estar vacio siempre porque esas letras son caracteres ascii y tienen codigos cortos a proposito. Por eso solo te lee bien el primero.

Yo probaria a leer uno de cada dos bytes del nombre del form a ver que ocurre:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. const
  3.   MyArray: Array [1 .. 5] of Byte = ($46, $6F, $72, $6D, $31);
  4. var
  5.   s,p: Byte;
  6. begin
  7.   for s := Low(MyArray) to High(MyArray) do
  8.   begin
  9.   P:= Pbyte($000000 + 2*s-1)^ ;
  10.     if p <> MyArray[ s ] then
  11.     begin
  12.       ShowMessage('El byte -' + IntTostr(p) + '- es diferente de ' + IntTostr
  13.           (MyArray) + '-');
  14.       Exit;
  15.     end
  16.     else
  17.       ShowMessage(' los 5 Bytes son correctos')
  18.   end;
  19. end;



He ejecutado el código propuesto, hay una pequeña omisión al intentar ejecutar IntTostr(MyArray) le hace falta el indice IntToStr(MyArray[ s ]).

Una vez corregido, al ejecutarlo muestra un error en la función PByte.

Estoy usando Delphi XE

Salud OS

Archivos adjuntos


  • 0

#13 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 17 marzo 2011 - 09:53

El error en IntTostr(MyArray) lo copie del codigo de Wilson, asi que yo no he sido!

Suena a lo que te digo de unicode, aunque mi intento no haya dado sus frutos... si miras los P y los pones en un TLabel todos juntos, en lugar de "Form1" ¿Que letras te salen? yo esperaba algo como "F_o_r_m_1" donde los _ son ceros.
  • 0

#14 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 17 marzo 2011 - 12:40

Hola:

djCheats, dices que lees de la memoria de la misma aplicación y que conoces el offset donde debe poner Form1, lo único que te puedo recomendar es que vayas leyendo bytes desde esa dirección y los anotes -o muestres en pantalla por ejemplo mediante ShowMessage(IntToStr(PByte($00000 + loquesea)^))), a ver si los valores que te va mostrando guardan semejanza con los que tú esperas que haya (mira a ver si son los mismos pero espaciados entre ellos). De todas formas, tengo curiosidad de saber cómo conoces que en dicha posición de memoria se encuentra esa cadena ... *-)

Egostar, PByte puede estar definida como una función pero normalmente es un puntero a Byte, definido así en la unit Windows.pas, no me extraña que te pete si estás accediendo a un posición de memoria aleatoria.

Saludos
  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 17 marzo 2011 - 02:28

Yo tengo curiosidad de saber porqué le interesa tanto esa dirección y la cadena encontrada en ella, justamente Form1. Me llama la atención que encuentre la cadena en 009534F4h pues esa posición suele estar fuera del alcance de la aplicación. Digo esto porque Windows carga la aplicación en 00400000h (Image Base) a no ser que en el linker se especifique otra cosa o que la aplicación pese algo mas de 5 Mb.  ^o|


Saludos.
  • 0

#16 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 17 marzo 2011 - 07:08

El error en IntTostr(MyArray) lo copie del codigo de Wilson, asi que yo no he sido!


:D :D :D Tampoco es mío,  es de las etiquetas, algo ocurre con las llaves [].

En la Pos Data del mismo "post" yo había hecho la advertencia, cuando intentaba corregir me aparecía todo el texto tachado, un muy extraño comportamiento.



PD: Algunos caractéres del código se pierden al etiquetarlos en este caso algunas de  las llaves que encierran el índice del array.


  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 marzo 2011 - 09:13


El error en IntTostr(MyArray) lo copie del codigo de Wilson, asi que yo no he sido!


    Tampoco es mío,  es de las etiquetas, algo ocurre con las llaves [].

En la Pos Data del mismo "post" yo había hecho la advertencia, cuando intentaba corregir me aparecía todo el texto tachado, un muy extraño comportamiento.



PD: Algunos caractéres del código se pierden al etiquetarlos en este caso algunas de  las llaves que encierran el índice del array.


Voy a revizar que paso con eso, igual que los emoticons que desaparecen cuando editas un mensaje, por ahi se dice que son los daños colaterales :D :D :D

Salud OS
  • 0

#18 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 16 mayo 2011 - 12:19

mm  imagino que solo quiere leer un array of byte desde la memoria usando punteros y el intento explicar o dar su pregunta sin profundizar o expandiser mucho...
  • 0




IP.Board spam blocked by CleanTalk.