Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   IntToBytes y viceversa (https://www.clubdelphi.com/foros/showthread.php?t=76747)

kdemia 24-11-2011 19:54:07

IntToBytes y viceversa
 
Que tal gente, queria saber como poder pasar un Integer (4 bytes) a un arreglo de bytes, es decir, a groso modo en delphi tendria que ser hipoteticamente asi

Código Delphi [-]
type
  intBytes = Array[0..3] of Byte;
var
  X: Integer;
  B: intBytes;
begin
  X:= 500;
  B:= IntToBytes(X);
  X:= BytesToInt(B);  
end;

El ejemplo es para ilustrar mejor el problema, osea quiza tmb necesite, o no, algun flag para el signo u otras cosas. A lo que voy es que no necesariamente quiero que quede asi el codigo, la idea es la conversion.

Saludos

ecfisa 24-11-2011 20:01:39

Hola.

Para pasar un entero a binario:
Código Delphi [-]
function IntToBin(Valor: Longint; Digitos: integer): string;
begin
  result:= StringOfChar('0', Digitos);
  while Valor > 0 do
  begin
    if Valor and 1 = 1 then
      Result[Digitos]:= '1';
    Dec(Digitos) ;
    Valor:= Valor shr 1;
  end;
end;
Luego podés recorrer la cadena resultante para asignar los valores a tu arreglo.

Saludos.

kdemia 24-11-2011 20:09:57

Gracias ecfisa, pero no hay una manera mas rapida que separar el binario en grupos de 8 ?

kdemia 24-11-2011 20:27:04

Resuelto.. cada numero corresponde a 256^Posicion * Numero[Posicion]

kdemia 24-11-2011 20:37:18

function BytesToInt(Num: intBytes): Integer;
begin
Result:= 256^3 * Num[3] + 256^2 * Num[2] + 256 * Num[1] + Num[0];
end;

function IntToBytes( X: Integer ): intBytes;
begin
Result[0]:= X mod 256;
Result[1]:= X div 256;
Result[2]:= X div 256^2;
Result[3]:= X div 256^3;
end;

ecfisa 24-11-2011 20:38:08

Hola kdemia.

No entiendo muy bién tu última pregunta, pero si quisieras hacer algo mas "a medida" al código de tu primer consulta:
Código Delphi [-]
...
type
  TIntBytes = Array[0..3] of Byte;

procedure CargarArreglo(var V: TIntBytes; Num: Byte); // valor máximo de Num: 15
var
  i: Byte;
begin
  for i:= 3 downto 0 do
    V[i]:= (Num shr i) and 1;
end;
Que sería similar a llamar a IntToBin(n, 4). Te estarías ahorrando el pasaje al arreglo, eso sí...

Saludos.

Edito: Me llamaron mientras estaba editando y no ví tus 2 nuevos mensajes. Pero veo que ya encontraste otra solución, me alegra mucho:)

Casimiro Notevi 24-11-2011 21:20:12

Por favor:


Lord Delfos 27-11-2011 04:20:09

Si entiendo bien la pregunta, se podría hacer algo como esto:

Código Delphi [-]
type TArreglo = array [1..SizeOf(Integer)] of Byte;

procedure Algo;
var Entero: Integer;
     Arreglo: ^TArreglo;
     Ind: Integer;
     A: String;
begin
  Entero:= 5;
  Arreglo:= @Entero;
  // Para mostrarlo no más.
  A:= '';
  for Ind:= 1 to SizeOf(Integer) do
    A:= A + '[' + IntToStr(Arreglo^[Ind]) + ']';
  ShowMessage(A);  
end;

Lo que hacemos es tener un puntero a un arreglo de x bytes (probablemente 4, pero nunca hay que fiarse de la longitud de un Integer, porque el tamaño puede variar), y una variable Integer propiamente dicha. Después asignamos al puntero la dirección de memoria del entero y listo.

Espero sirva. Saludos.


La franja horaria es GMT +2. Ahora son las 10:00: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