Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Delphi para la web (https://www.clubdelphi.com/foros/forumdisplay.php?f=51)
-   -   conversión hexadecimal (https://www.clubdelphi.com/foros/showthread.php?t=81375)

yevabas 08-11-2012 20:02:21

conversión hexadecimal
 
Buenos tardes

La verdad necesito hacer una XOR con unos datos que recibo por el puerto, pero hasta el momento nada me funciona y no encontre nada que me ayudara, disculpen si ya lo trataron pero no vi nada.

la idea es que recibo los siguientes datos y me quedan almacenados en un memo de la siguiente manera, a los datos del puerto le aplico la siguiente función para que se vean en hexa.


Código Delphi [-]
for r := 1 to  Count do
    begin
     dato3:= IntToHex((Ord(dato1[r])),1);
     dato4 := dato4 + dato3;      
end;
 Memo2.Lines.Add(dato4);

donde count es la cantidad de bytes recibidos por el puerto, al final en memo2 se vera

Cita:

AAAE3153
ahora necesito hacerle una XOR, entonces el resultado debe ser 66 en hexa por supuesto, si utilizo la función Ord() este solo me toma cada caracter independiente y no como un byte, mejor dicho AA es 170 en decimal y si utilizo la funcion Ord() me da 4141,en realidad no se como hacer para que se tome los dos caracteres como uno solo y se convierta a decimal sin problemas.

estoy utilizando el componente Tcomport 4.


Muchas gracias por su colaboración y tiempo

ecfisa 08-11-2012 21:35:45

Hola yebabas.

Si no entiendo mal lo que buscas realizar, tenes que tomar la cadena de a dos caracteres:
Código Delphi [-]
ShowMessage(IntToStr(StrToInt('$'+'AA'))+#13#10+
            IntToStr(StrToInt('$'+'AE'))+#13#10+
            ...);

Por ejemplo, si tenes el número hexadecimal en una cadena y quisieras pasarlo a otra en formato decimal separado por un espacio:
Código Delphi [-]
function Hex2dToInt(const Hexa: string): string;
var
  i,c: Integer;
begin
  c:= 1;
  for i:= 1 to Length(Hexa) div 2 do
  begin
    Result := Result + IntToStr(StrToInt('$' + Copy(Hexa, c, 2))) + ' ';
    Inc(c, 2);
  end;
  SetLength(Result,Length(Result)-1);
end;

// Ejemplo de llamada:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Text := 'AAAE3153';
  Memo1.Lines.Add(Hex2dToInt(Memo1.Text));
end;

Saludos.

Edito: Es claro que se debe convenir el uso de dos caracteres para representar un valor numérico hexadecimal.

nlsgarcia 10-11-2012 22:19:27

yevabas,

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  function HexToInt(NumHex: String): Int64;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Convierte números Hexadecimales a Decimales
function HexToInt(NumHex: String): Int64;
var
  i, j : Integer;
  Hex : String;

  AuxStr : String;
  NumDec: Int64;

  PowerHex: Int64;
  AuxPower : Extended;

begin

   NumDec := 0;
   j := Length(NumHex);

   for i := j downto 1 do
   begin

      AuxPower := Power(16,j-i);
      AuxStr := FloatToStr(AuxPower);
      PowerHex := StrToInt(AuxStr);

      Hex := NumHex[i];

      if (Hex ='A') then Hex := '10';
      if (Hex ='B') then Hex := '11';
      if (Hex ='C') then Hex := '12';
      if (Hex ='D') then Hex := '13';
      if (Hex ='E') then Hex := '14';
      if (Hex ='F') then Hex := '15';

      NumDec := NumDec + StrToInt(Hex) * PowerHex;

   end;

   Result := NumDec;

end;

// Versión 1:
// Recibe Datos Hex de un Puerto Serial en modo Byte y los muestra en Hex en un Control TMemo
// Se asume que los Datos Hex son enviados al Puerto Serial en su representación Decimal para su
// posterior procesamiento.
procedure TForm1.Button1Click(Sender: TObject);
var
   BufferPort : Array[1..80] of Byte; // Asume para la prueba que se reciben 80 Bytes del Puerto Serial
   i : Integer;
   DataPort : String;

begin

   // Inicializa BufferPort antes de recibir datos del Puerto Serial
   FillChar(BufferPort, Sizeof(BufferPort), 0);

   // Simula recibir datos del Puerto Serial a BufferPort iniciando en AA = 170
   for i:= 1 to 80 do
   begin
      BufferPort[i] := 169 + i;
   end;

   // Recorre BufferPort y almacena los datos en DataPort
   for i:= 1 to 80 do
   begin
      // Los Datos de BufferPort son convertidos a Hexadecinales de longitud 2
      DataPort := DataPort + IntToHex(BufferPort[i],2);
   end;

   // Almacena los datos del Puerto Serial en un Control TMemo
   Memo1.Lines.Add(DataPort);

end;

// Versión 2:
// Recibe Datos Hex de un Puerto Serial en modo Char y los muestra en Hex en un Control TMemo
// Se asume que se requiere la representación Decimal de los Datos Hex para su posterior
// Procesamiento
procedure TForm1.Button2Click(Sender: TObject);
var
   BufferPort : Array[1..80] of Byte; // Asume para la prueba que se reciben 80 Bytes del Puerto Serial
   i, j : Integer;
   DataPort : String;
   SerialPort : String;
   NumHex : String;

begin

   // Inicializa BufferPort antes de recibir datos del Puerto Serial
   FillChar(BufferPort, Sizeof(BufferPort), 0);

   // Simula recibir datos del Puerto Serial a SerialPort
   Serialport := '010203040506070809AABBCCDDEEFF';

   // Extrae los datos simulados del Puerto Serial a BufferPort
   j := 1;
   for i:= 1 to Length(SerialPort) do
   begin
      if (i Mod 2 <> 0) then
      begin
         NumHex := Copy(SerialPort,i,2);
         BufferPort[j] := HexToInt(NumHex);
         Inc(j);
      end;
   end;

   // Recorre BufferPort y almacena los datos en DataPort
   for i:= 1 to 80 do
   begin
      // Los Datos de BufferPort son convertidos a Hexadecinales de longitud 2
      DataPort := DataPort + IntToHex(BufferPort[i],2);
   end;

   // Almacena los datos del Puerto Serial en un Control TMemo
   Memo1.Lines.Add(DataPort);

end;

// Versión 3:
// Recibe Datos Hex de un Puerto Serial en modo Char y los muestra en Hex en un Control TMemo
// Esta es una versón reducida de la anterior en la cual se asume que no se requiere la
// representación Decimal de los Datos Hex obtenidos del Puerto Serial.
procedure TForm1.Button3Click(Sender: TObject);
var
   i : Integer;
   DataPort : String;
   SerialPort : String;
   NumHex : String;

begin

   // Simula recibir datos del Puerto Serial a SerialPort
   Serialport := '010203040506070809AABBCCDDEEFF';

   // Extrae los datos simulados del Puerto Serial a DataPort
   for i:= 1 to Length(SerialPort) do
   begin
      if (i Mod 2 <> 0) then
      begin
         NumHex := Copy(SerialPort,i,2);
         DataPort := DataPort + NumHex;
      end;
   end;

   // Almacena los datos del Puerto Serial en un Control TMemo
   Memo1.Lines.Add(DataPort);

end;

end.
El código anterior muestra tres versiones que simulan recibir datos Hexadecimales de un Puerto Serial y visualizan la data recibida en un Control TMemo, quizás alguna versión se adapte a tu proyecto.

Espero sea útil :)

Nelson.

nlsgarcia 11-11-2012 01:28:41

yevabas,

Cita:

Empezado por yevabas (Mensaje 448964)
La verdad necesito hacer una XOR con unos datos que recibo por el puerto

Nota del código anterior:

Las versiones 1 y 2, permiten realizar operaciones numéricas y binarias a los datos Hexadecimales recibidos del Puerto Serial, dado que están en formato Decimal en un Arreglo de Bytes.

La versión 3 solo permite operaciones de String, debido a dado que no hay ninguna conversión de la Data Recibida.

Espero sea útil :)

Nelson.

yevabas 13-11-2012 22:46:44

gracias por la ayuda
 
Gracias a todos, toda la información fue muy util al final lo adapte a lo que necesitaba y quedo así

Código Delphi [-]
procedure TForm1.btn1Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Text := 'AAAE3153';
  hex2();
end;


procedure TForm1.hex2();
var
  i,c,k,h: Integer;
  dm,dm1,x: string;
begin

  c:= 1;
  for i:= 1 to Length(Memo1.Text) div 2 do
  begin
   dm:= IntToStr(StrToInt('$' + Copy(Memo1.Text, c, 2)));
   Inc(c, 2);
   k:= k xor StrToInt(dm);
   edt1.Text := IntToStr(k)
  end;

  edt1.Text:='0h'+ inttohex(k,2);

  SetLength(dm,Length(dm)-1);

end;


entonces en edt1 me quedo 66 en heaxa que es el resultado de hacer una xor entre los valores que hay memo1


de nuevo muchas gracias y como siempre aprendiendo cada vez mas con su ayuda!!!


La franja horaria es GMT +2. Ahora son las 01:32:42.

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