Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Transformar un String[4] en un Real (https://www.clubdelphi.com/foros/showthread.php?t=30929)

cmurua71 24-04-2006 06:36:14

Transformar un String[4] en un Real
 
Hola

Tengo un problema al recibir datos por el puerto serie. Tratare de ser organizado al respecto:

1- Los datos provienen de un dispositivo que me envia 4 bytes, estos bytes son los correspondientes a un REAL (IEEE, la representacion en 32 bits de un real).
2- Esos datos llegan a la PC, en la misma corro un programa en Delphi. En este programa utilizo un componente TDataPacket, asociado a un componente TComPort
3- El componente TDataPacket me sensa el encabezado de la cadena y lee los 4 bytes.
4- El problema es que el componente me entrega esos 4 bytes como 4 caracteres (un string en realidad), PERO EN REALIDAD SON UN REAL.
5- Por lo tanto... Como transformo esos 4 bytes en un REAL, que es lo que en realidad representan ??

Probe de varias formas con punteros, pero ninguna me funcionó

ALGUNA IDEA, AYUDA ?? Sera muyy bienvenida la ayudaa

Desde ya muchas gracias, UN ABRAZO

Carlos

marcoszorrilla 24-04-2006 07:06:24

En un principio parece te quedaría poner la coma a esa cadena y luego aplicar la función FloatToStr(X).

Cita:

Unit

Sysutils

Category

floating point conversion routines

function StrToFloat(const S: string): Extended;

Description

Use StrToFloat to convert a string, S, to a floating-point value. S must consist of an optional sign (+ or -), a string of digits with an optional decimal point, and an optional mantissa. The mantissa consists of 'E' or 'e' followed by an optional sign (+ or -) and a whole number. Leading and trailing blanks are ignored.

The DecimalSeparator global variable defines the character that must be used as a decimal point. Thousand separators and currency symbols are not allowed in the string. If S doesn't contain a valid value, StrToFloat raises an EConvertError exception.
Un Saludo.

cmurua71 24-04-2006 08:15:35

Interpretar 4 bytes como Real
 
Cita:

Empezado por marcoszorrilla
En un principio parece te quedaría poner la coma a esa cadena y luego aplicar la función FloatToStr(X).



Un Saludo.

Gracias por la ayuda, pero no es eso lo que ando necesitando, y explico por qué:

La funcion FloatToStr me convertiria un String como '53.5' en el Real 53.5
El problema que tengo es que en este caso los bytes que vienen no represntan (siguiendo el ejemplo) el caracter '5' ni el siguiente el '3' y asi sucesivamente.
Los bytes que me son enviados constituyen los cuatro juntos, la representacion en formato ANSI/IEEE 754-1985, el problema es que debo interpretar los bytes de ese modo y no como strings ni char.

Logro hacerme entender ?

UN abrazo

Carlos

Lepe 24-04-2006 11:14:52

http://en.wikipedia.org/wiki/IEEE_754

viene tanto la definición como un ejemplo.

Saludos

seoane 24-04-2006 13:49:35

Bien, todo depende del orden en que te manden esos bytes. Me explico:

Tenemos, por ejemplo el numero:

-118.625

Cuya representacion en IEEE es:

11000010 11101101 01000000 00000000

Si te manda los bytes de derecha a izquierda, podemos hacer algo como esto:

Código Delphi [-]
function StrToSingle(Str: String): Single;
begin
  if length(Str) = 4 then
    Result:= PSingle(@Str[1])^
  else
    Result:= 0;
end;

Pero si por el contrario, te manda los bytes de izquierda a derecha tenemos que darles la vuelta primero :)

Código Delphi [-]
function StrToSingle2(Str: String): Single;
var
  i: integer;
  S: string;
begin
  if length(Str) = 4 then
  begin
    S:= '';
    for i:= 4 downto 1 do
      S:= S + Str[i];
    Result:= PSingle(@S[1])^
  end
  else
    Result:= 0;
end;

Por ultimo te dejo un ejemplo, para que pruebes la funcion:

Código Delphi [-]
var
  s: string;
begin
  // 11000010 11101101 01000000 00000000 = -118.625
  SetLength(s,4);
  s[4]:= #194; //11000010
  s[3]:= #237; //11101101
  s[2]:= #64;  //01000000 
  s[1]:= #0;   //00000000
  ShowMessage(FloatToStr(StrToSingle(s)));
end;

¿Era esto lo que buscabas?

cmurua71 24-04-2006 19:47:49

Si, era esto
 
Muchisimas gracias, esto es lo que andaba buscando

En el dia de hoy en cuanto pueda agarrar la maquina lo pruebo, y les estoy comentando el resultado

Un abrazo

Carlos


La franja horaria es GMT +2. Ahora son las 18:18:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi