Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   transformar array of bytes en string (https://www.clubdelphi.com/foros/showthread.php?t=44171)

aluky 30-05-2007 13:52:31

transformar array of bytes en string
 
Hola a todos, estoy haciendo una aplicación cliente servidor. Las comunicaciones se hacen con ipworks,lo que tengo que enviar lo tengo en un registro con varios campos. y me gustaría saber si hay alguna manera de transformar ese registro, de string, y despues de estring a registro otra vez.

Si no es posible, hay alguna manera de serializar, una clase con delphi 2006, o algún otro método para no tener que ir pasando todo a string a mano (tengo que enviar bastantes campos de distintos tipos cada uno), sino que se haga automáticamente?

gracias a todos.

Un saludo

delphi.com.ar 30-05-2007 18:19:07

Una posible respuesta a tu prengunta, puede ser:
Código Delphi [-]
type
  TMyRecord = record
    Data: array[0..255] of byte;
  end;
...
var
  R: TMyRecord;
  S, Q: string;
begin
  { String a Array }
  S := 'Hola Mundo!';
  ZeroMemory(@R.Data[0], High(R.Data));
  StrPLCopy(@R.Data[0], S, High(R.Data));

  { Array a String }
  SetLength(Q, High(R.Data));
  Move(R.Data[0], Q[1], High(R.Data));

  ShowMessage(Q);

Ahora... yo no se para que utilizas el array de Bytes, pero viendo que lo quieres convertir a un string, supongo que estas almacenando cadenas de caracteres, o sea array de Chars no de Bytes. En ese caso el compilador te da una mano:

Código Delphi [-]
  TMyRecord = record
     CharData: array[0..50] of char;
  end;
...
var
  R: TMyRecord;
begin
  R.CharData := 'Hola Mundo!';
  ShowMessage(R.CharData);
Pero... si verdaderamente necesitas que sea un array de bytes, para facilidad yo definiría el registro de la siguiente manera, teniendo apuntado ambos tipos de array al mismo sector de memoria:

Código Delphi [-]
  TMyRecord = record
    case Integer of
    0: (
       ByteData: array[0..50] of byte;
       );
    1: (
       CharData: array[0..50] of char;
      );
  end;

Saludos!

aluky 02-06-2007 14:10:37

re: para que lo quiero
 
hola, Antes de nada gracias por contestar

te cuento lo que me hace falta con mas detalle.

tengo que comunicarne mediante tcp usando los componentes de ipworks, para manjar y almacenar los mensajes que tenemos que enviar vamos a utlizar una estructura de tipo record o una clase (delphi 2006). Cuando vayamos a enviar lo que se quiere hacer es coger e record o la clase (si se puede) y transformarlo en un chorro de bytes o en un PansiChar, que es lo que hay que pasarle al método send del componnete de ipqworks. Esto se que con los componentes de indy se puede hacer con rawtoBytes, pero con ipworks no se.

en el otro lado, al recibir se recoje un string, que habria que transformar otra vez en un record o en una clase.


bueno, gracias por anticipado por las respuestas

delphi.com.ar 04-06-2007 16:35:50

Bueno, en ese caso si todos tus records son de utilizan tipos de tamaños fijos, puedes copiar directamente la memoria:
Código Delphi [-]
var
  R: TFloatingSaveArea; { Definido en la unit Windows }
  S: string;
begin
  { Record to String } 
  SetLength(S, SizeOf(TFloatingSaveArea));
  Move(R, S[1], SizeOf(TFloatingSaveArea));

  { String to Record } 
  Move(S[1], R, SizeOf(TFloatingSaveArea));
Debes tener en cuenta que en este ejemplo la copia del string al record, da por echo que el string tiene el tamaño y los datos acordes al registro.

Saludos!


La franja horaria es GMT +2. Ahora son las 16:23:25.

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