Ir al contenido


Foto

String de Hexadecimal to Array of Byte?


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

#1 c0lo

c0lo

    Advanced Member

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

Escrito 03 septiembre 2009 - 08:22

Bueno una pequeña acerca de como desarrollar esta funcion en delphi..

E intentando hacer de las mil maneras pero ninguna sin exito :(

Haber tengo mi String conformado por un conjunto de numeros hexadecimales.



delphi
  1. Const
  2.   Variable: String = '10 25 A1 2C 0C AA FF 02 10';



Dicho String quiero llevarlo por medio de algun truco o un Array of Byte.

Espero ideas y ayuda. Gracias :cry:
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 septiembre 2009 - 11:15

Después de sesuda sesión de mi amor (poliburro) y una servilleta (o sea yo) te tenemos una buena noticia y una mala... jejeje, no todo en la vida es color de rosa...  :p

La buena es que pudimos generar este código que sabemos que manda tu cadena al arreglo tal y como lo necesitas:



delphi
  1. unit PasoCad;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, StrUtils;
  8.  
  9.                             const
  10.   cadena = '10 25 A1 2C 0C AA FF 02 10';
  11.  
  12. type
  13.   TForm1 = class(TForm)
  14.     Button1: TButton;
  15.     procedure Button1Click(Sender: TObject);
  16.   private
  17.     { Private declarations }
  18.   public
  19.     { Public declarations }
  20.   end;
  21.  
  22. var
  23.   Form1: TForm1;
  24.   arreglo: array[1..9] of Byte;
  25.  
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31. procedure TForm1.Button1Click(Sender: TObject);
  32. var
  33.   i,pos:integer;
  34.   aux, envia: String;
  35. begin
  36.   aux:= cadena;
  37.   i:=1;
  38.   while length(aux) > 0 do
  39.     begin
  40.       pos:= Ifthen(AnsiPos(' ',aux)=0,Length(aux),AnsiPos(' ',aux));
  41.       envia:= AnsiLeftStr(aux,pos-1);
  42.       arreglo[i-1]:= strtoint('$'+envia);
  43.       aux := midstr(aux,pos+1,length(aux));
  44.       inc(i);
  45.     end;
  46. end;
  47.  
  48. end.



... la mala noticia es que nos debes casi la vida, pero con unas cocas bien frí­as nos damos por bien servidos, jejejeje, bromita, pero es que esto de programar después de media noche, no es bueno  :p  :$

Saludox !  :D
  • 0

#3 c0lo

c0lo

    Advanced Member

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

Escrito 04 septiembre 2009 - 02:09

Muchas gracias amigos os debo una :D  :cheesy:
  • 0

#4 c0lo

c0lo

    Advanced Member

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

Escrito 04 septiembre 2009 - 02:11

Epa muy rapido e visto, aun no entiendo como lo hace es decir como introducen la cadena Hexadecimal al Array of Byte?

Disculpen... :embarrassed:
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 04 septiembre 2009 - 09:15

Hola amigo !

No te preocupes... pa' eso estamos  :p

En realidad la linea que hace todo para enviar el string a su posicion en el array of byte, es esta:



delphi
  1. arreglo[i-1]:= strtoint('$'+envia);



Si te fijas, lo que hace son dos cosas fundamentalmente:

1. Concatena al string que está leyendo el signo de '$' que es el sí­mbolo de un hexadecimal, ejemplo: el FF lo hacemos $FF
2. Convierte el string ya con el sí­mbolo '$' a un entero y de esta manera el arreglo lo acepta sin problemas.

El resto del código son manipulación de cadenas para ir recorriendo, extrayendo y recortando la cadena original en cada iteración, por eso, hacemos uso de una variable aux que en realidad es la que manipulamos...

Espero me haya explicado  :$, si no, pregunta con confianza :D

Saludox !  :D
  • 0

#6 c0lo

c0lo

    Advanced Member

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

Escrito 04 septiembre 2009 - 04:53

Ya ahora si entendi bien, en resumen el procedimiento coje el string "FF 41 A4 10 01" y lo convierte en "($FF,$41,$A4,$10,$01)" en un array[0..4] of byte .

Muchas gracias
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 septiembre 2009 - 08:44

Si siempre se mantendrá ese "tamaño" y "formato" creo que se puede resumir ese código.

Mi cabeza hizo esto, y al parecer anda:



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. Const
  10.   CADENA: String = '10 25 A1 2C 0C AA FF 02 10';
  11.  
  12. type
  13.  
  14.   TForm1 = class(TForm)
  15.     Button1: TButton;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure Button1Click(Sender: TObject);
  18.   private
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   end;
  23.  
  24. var
  25.   Form1: TForm1;
  26.   Vector: array [1..9] of byte;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. var i,j: integer;
  34.     aux: string;
  35. begin
  36.   aux := CADENA;
  37.   for i := 1 to 9 do
  38.     begin
  39.       vector[i] := StrToInt('$' + Copy(aux,1,2));
  40.       if i < 9
  41.         then delete(aux,1,3);
  42.     end;
  43. end;
  44.  
  45. procedure TForm1.Button1Click(Sender: TObject);
  46. var i: integer;
  47. begin
  48.   for i := 1 to 9 do
  49.     showMessage(IntToStr(vector[i]));
  50. end;
  51.  
  52. end.



Saludos,

  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 04 septiembre 2009 - 10:48

Hola

Aquí­ mi propuesta.



delphi
  1. var
  2.   Form1: TForm1;
  3.   Lista: TStringList;
  4.   Vector: array [0..8] of byte;
  5.  
  6. const
  7.   cadena = '10 25 A1 2C 0C AA FF 02 10';
  8.  
  9. implementation
  10.  
  11. {$R *.dfm}
  12.  
  13. procedure TForm1.Button1Click(Sender: TObject);
  14. var
  15.   i: Integer;
  16. begin
  17.   Lista := TStringList.Create;
  18.   Assert(Assigned(Lista)) ;
  19.   Lista.Clear;
  20.   Lista.Delimiter := ' ';
  21.   Lista.DelimitedText := Cadena;
  22.   for i := 0 to 8 do
  23.   begin
  24.     vector[i] := StrToInt('$' + Lista[i]);
  25.   end;
  26.   Lista.Free;
  27. end;
  28.  
  29. end.



Salud OS
  • 0




IP.Board spam blocked by CleanTalk.