Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-06-2016
0x90 0x90 is offline
Registrado
NULL
 
Registrado: jun 2016
Posts: 5
Poder: 0
0x90 Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 21-06-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 21-06-2016
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 12
BDWONG Va por buen camino
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...
Responder Con Cita
Respuesta



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
Duda sobre valor de Array Of Byte JuanOrtega Varios 4 21-08-2015 01:38:11
Convertir imagen en Array of Byte jlrdz OOP 4 04-05-2015 17:47:56
Salvar un array of byte en firebird? sonjeux Firebird e Interbase 3 30-01-2014 02:34:19
Como convertir un string a un array de byte K-ba Varios 2 14-02-2011 00:27:07
¿Buffer: array[0..1024] of Byte;? JXJ Varios 2 29-03-2009 23:05:46


La franja horaria es GMT +2. Ahora son las 20:05:59.


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