PDA

Ver la Versión Completa : conversión hexadecimal


yevabas
08-11-2012, 20:02:21
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.



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

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:

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:

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:

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,


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 a todos, toda la información fue muy util al final lo adapte a lo que necesitaba y quedo así


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!!!