Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Delphi para la web
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-11-2012
yevabas yevabas is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 42
Poder: 0
yevabas Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 08-11-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-11-2012 a las 22:31:43.
Responder Con Cita
  #3  
Antiguo 10-11-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 10-11-2012 a las 22:27:03.
Responder Con Cita
  #4  
Antiguo 11-11-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
yevabas,

Cita:
Empezado por yevabas Ver Mensaje
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.
Responder Con Cita
  #5  
Antiguo 13-11-2012
yevabas yevabas is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 42
Poder: 0
yevabas Va por buen camino
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!!!
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
Codigo Hexadecimal kdemia Varios 18 06-05-2014 12:56:48
delphi hexadecimal yevabas Varios 0 13-11-2011 00:18:33
Resta Hexadecimal ??? Ðαяισš Varios 6 15-09-2010 11:34:17
Verificar cadena es Hexadecimal yapt Varios 4 19-11-2009 16:37:51
de Hexadecimal a Decimal Carlos A Ortega Varios 1 04-08-2003 22:14:56


La franja horaria es GMT +2. Ahora son las 13:58:26.


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
Copyright 1996-2007 Club Delphi