Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   string a integer? (https://www.clubdelphi.com/foros/showthread.php?t=53615)

acertij022 25-02-2008 19:09:36

string a integer?
 
Hola Foristas se me presento una inquietud, necesito transformar un aray de char (tomado de memoria ) a Integer pero no encuentro nada y no entiendo la realacion en que delphi guarda un enetero a l disco

por ejemplo el numero 18 si lo guardo como archivo de entero me guarda en el archivo 0x12 0x00 0x00 0x00 y necesitaria saber la logica para poder tener apartir de los 4 bytes el entero.

Desdea ya muchas gracias anticipadas

acertij022 25-02-2008 19:30:33

me respondo ami mismo en c:
el numero 18 se guara en 4 bytes = 0x00 0x00 0x00 0x12 =(ord(Str1[1])*16777216)+(ord(Str1[2])*65536)+(ord(Str1[3])*256)+ord(Str1[4])
pero en delphi se graba al reves:
0x12 0x00 0x00 0x00 = (ord(Str1[4])*16777216)+(ord(Str1[3])*65536)+(ord(Str1[2])*256)+ord(Str1[1])

:D es algo tonto pero me tomo toda la mañana

ContraVeneno 25-02-2008 22:49:29

a caray... no pues que complejo para mis novatos conocimientos...

yo hiba a proponer la funcion "TryStrToInt" o "StrtoInt", pero veo que es más que solo eso.....

jachguate 26-02-2008 04:36:27

El por que se escriben en ese orden, no es un asunto de delphi, es un asunto de intel.

Lee sobre Endianness y lo comprenderás.

Hasta luego.

;)

Edito: el artículo en inglés es mucho mas completo (como suele suceder): http://en.wikipedia.org/wiki/Endianness

Lord Delfos 26-02-2008 23:24:30

Hola, acertij022.

Yo he hecho algo así:

Código Delphi [-]
var Arreglo:array[1..4] of char;
    Destino:integer;
    p:PChar;
begin
  p:=@Destino; //p apunta al primer byte de Destino
  p^:=Arreglo[1];inc(p); // Seteamos el destino de p con el valor del arreglo e 
                                //  incrementamos el puntero para ir a la segunda posición.
  p^:=Arreglo[2];inc(p);// Y así sucesivamente...
  p^:=Arreglo[3];inc(p);
  p^:=Arreglo[4];
end;

Dos cosas a tener en cuenta.

[1] La endianess del tipo. No sé qué pasaría si el integer fuera big-endian...
[2] El tipo de dato integer es genérico, y no necesariamente va a tener 32 bits... Sería más seguro usar Longint, que siempre va a tener 32 bits.

Espero te sirva. Saludongos.


La franja horaria es GMT +2. Ahora son las 22:55:53.

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