Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manejo de PWideString a Byte Array? (https://www.clubdelphi.com/foros/showthread.php?t=90484)

0x90 21-06-2016 08:20:23

Manejo de PWideString a Byte Array?
 
Saludos!

Llevo desde varios dias (3 para ser exacto) con una situacion demaciada problematica (o al menos para mi) la cual intento realizar para una aplicacion que estoy haciendo.

La aplicacion toma los datos del segundo parametro de las funciones send() y recv() del winsock y la lee, la data esta encriptada con un algoritmo que yo se manejar, y he hecho una funcion que me permite decifrar los paquetes que recibo.

Dicha funcion toma un parametro tipo array of byte el cual puedo definir y inicializar de la siguiente manera:

Código Delphi [-]
const
  Ejemplo: Array[0..17] of Byte = ($65, $73, $74, $6F, $20, $65, $73, $20, $75, $6E, $20, $65, $6A, $65, $6D, $70, $6C, $6F);

Aqui mi funcion utilizada para cifrar/decifrar paquetes:

Código Delphi [-]
<...>

type
  ReturnArray = array of byte;

<...>

function Crypt(Packet: array of Byte): ReturnArray;
var
  I: Integer;
  HashPointer: integer;
  Decrypt: ReturnArray;
begin
     SetLength(Decrypt, Length(Packet));
     HashPointer := 0;

     for I := 0 to Length(Packet) do
     begin
          Decrypt[i] := Byte(Packet[i] Xor (HashTable_A[HashPointer]) Xor (HashTable_B[HashPointer]));
          HashPointer := ((HashPointer + 1) Mod 255);
     end;
  Result := Decrypt;
end;

Nota Aclaratoria: la HashTable_A y HashTable_B las tengo definidas en la seccion de declaracion de variables que tengo arriva del codigo, hasta el momento no veo necesario el compartirlas asi que por eso no las pongo, si es necesaria, solo pedid y se os dara ^\||/

Como ven dicha funcion trabaja perfectamente bien con una Array of Bytes estatica, ahora, mi idea era originalmente tomar el buffer del send() y recv() y manejarlo hasta que quedara una Byte Array para asi poder entonces pasar la data del buffer a la funcion de Crypt y asi poder realizar exitosamente la funcion.

Mi otra idea seria modificar la funcion Crypt, y hacerla que en vez de que accepte un array of byte, que entonces accepte directamente un PWideString (PChar) que es donde el buffer se encuentra osea un puntero a char.

Ahora entendiendo esto, mi problema se encuentra en que no se como implementar estas dos cosas que he explicado, He tratado de hacer varias conversiones pero ninguna trabaja, y escencialmente la raiz de todo esta en que necesito O convertir de PChar a Array of Byte o modificar la funcion Crypt... Como podria yo hacer dicha implementacion, si no de una, pues de la otra.

He aqui una de las funciones que he tratado de hacer usar con la implementacio pero no logro completar mi mision:

ConvertDataToByteArray
pastebin.com/3iuXbwKX (Esta es la mas cercana que tengo para completar lo que quiero, pero asi mismo me sigue fallando)

PD. Disculpen si algunos pudiera molestarles como trabaje la gramatica en mi texto, es que aunque mi lenguaje materno es el español, lo mas que hablo y escribo es el Ingles, ya que vivo en los Estados Unidos ;) espero sean entendidos.

Reasen 21-06-2016 16:40:34

Resumiendo: el problema que tienes es la conversión de tipos de variables,
Recibes un PChar y lo necesitas convertir a ByteArray para que la función desencripte los paquetes, luego pasarlo a string y leer la información.
Ten encuentra que deberías decir si estas usando Delphi 7 o XE ya que las conversiones pueden variar entre esos 2 Delphi's

//Te dejo en Delphi XE10 un método sencillo que me funciona a mí:

Código Delphi [-]
var
ValPChar:PChar;
ValString:AnsiString;
begin
ValPChar:='testing';
ValString:=AnsiString(ValPChar);
end;

//Te dejo una función para que lo conviertas en ByteArray:

function StringToByteArray(sCadena: AnsiString): TBytes;
var
  i: integer;
begin
  SetLength(Result, Length(sCadena));

  for i := 0 to Length(sCadena) do
    Result[i - 1] := byte(sCadena[i]);
end;

//Te dejo una función para que lo conviertas en AnsiString:

function ByteArrayToString(bByteArray: TBytes): AnsiString;
var
  i: integer;
begin
  SetLength(Result, Length(bByteArray));

  for i := 0 to Length(bByteArray) do
    Result[i + 1] := AnsiChar(bByteArray[i]);
end;

BDWONG 21-06-2016 17:09:32

Otra alternativa para pasar un string a un arreglo de bytes es usar la funcion StrLCopy

Código Delphi [-]
var
  buffer:TBytes;
  source:String;
begin
   source:='I am a String';

   SetLength(buffer,Length(source));
   StrLCopy(pchar(buffer),pchar(source),Length(source));

end.

PD: Esta funcion trabaja tanto con pchar como pwidechar
Saludos...


La franja horaria es GMT +2. Ahora son las 19:30:10.

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