comp.lang.ada
 help / color / mirror / Atom feed
From: "frikk" <frikker@gmail.com>
Subject: Re: Reading Float Data from a binary file into ada
Date: 31 Jan 2007 10:38:19 -0800
Date: 2007-01-31T10:38:19-08:00	[thread overview]
Message-ID: <1170268699.548152.214890@q2g2000cwa.googlegroups.com> (raw)
In-Reply-To: <1170252776.235803.122220@j27g2000cwj.googlegroups.com>

On Jan 31, 9:12 am, "frikk" <frik...@gmail.com> wrote:
> On Jan 30, 10:54 pm, "Steve" <nospam_steve...@comcast.net> wrote:
>
>
>
>
>
> > "frikk" <frik...@gmail.com> wrote in message
>
> >news:1170172307.292500.256090@m58g2000cwm.googlegroups.com...
>
> > > Hello everyone! I am having a problem that I would love some help
> > > with.
>
> > > Essentially I was given a Visual Basic program that dumps a binary
> > > configuration file with all of the variables in a set.  The variables
> > > are each 32 bit floats, with the first 16 bits being the integer part
> > > and the second 16 bits being a representation of the fraction (I'm not
> > > sure if this is stanard - but its just how VB dumps the data). The
> > > binary dump is basically a copy of the way VB stores the data in
> > > memory.  I need to be able to use this data in ada.  There is a C
> > > counterpart to this that makes use of a 'union' to grab the data 1
> > > byte (8 bits) at a time, put them into a char array of size 4, then
> > > use a 32 bit float to reference the data.  Is there somehow I can do
> > > this in ada as well?
>
> > Your description of how the C counterpart works is inconsistant with the way
> > you have described the data format in the file.
>
> > If the C program is using a union to view the data as either a float or a 4
> > character array then it is very likely that the data is in fact stored in
> > IEEE 754 floating point format.  If you are using Microsoft's C compiler
> > this is certainly the case.
>
> > The following snippet contains the pieces you need to do the conversion.
>
> >       TYPE aByte IS MOD 256;
>
> >       FOR aByte'SIZE USE 8;
>
> >       TYPE aByteArray IS ARRAY( Positive RANGE <> ) OF aByte;
>
> >       PRAGMA PACK( aByteArray );
>
> >       TYPE aFourBytes IS NEW aByteArray(1..4);
>
> >       FUNCTION Conv IS NEW Ada.Unchecked_Conversion( aFourBytes, float );
>
> >       ...
>
> >       a : float;
> >       b : aFourBytes;
>
> >       ...
>
> >       a := Conv( b )
>
> > Use unchecked conversion to convert from a type that contains 4 bytes to the
> > float value you're looking for.
>
> > Regards,
> > Steve
> > (The Duck)
>
> > > Basically I need to be able to read in the binary data byte by byte
> > > but store it into a 32 bit Float.  The C union example above uses the
> > > same memory address for the Float as it does for the size 4 char
> > > array. I don't even know if the VB dump will correspond with the way
> > > ada handles floats or not, but I'll worry about that later.
>
> > > I am also using Matlab/Simulink if that provides any additional tools
> > > to use for debugging.
>
> > > Thank you for any help,
> > > Blaine- Hide quoted text -
>
> > - Show quoted text -
>
> Thank you for the example code! I'll play around with this and see how
> it works.  Yes, you are correct that the C code and the VB code don't
> seem to make sense.  I'm going to verify that this C code does work
> exactly as we want it to.
>
> Thank you!
> Blaine- Hide quoted text -
>
> - Show quoted text -


Alright - so I figured some things out. Don't worry about what I said
about fixed point, I was very confused on how floating point numbers
were stored and it turns out it was stored exactly as it was supposed
to be. I was analyzing the floating point binary like it was a normal
number.  Oops... :(

Anyway, I notice that when dumping a binary file and when reading it
in, we are swapping the bytes around. Something like: for (i = 0; i<4;
i++){out[3-i] = in[i];).  Is this because of the way the hardware
would interpret the binary data for processing? This would mean that
in memory the binary resembles nothing like the actual ieee format,
even though it works correctly.

So my main question at this point is: How do I create the equivelant
of this:
union float_union
{
  float x;
  unsigned char c[4];
};

Would the examples given like for this?
Thank you,
Blaine




  reply	other threads:[~2007-01-31 18:38 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-30 15:51 Reading Float Data from a binary file into ada frikk
2007-01-30 16:37 ` Dmitry A. Kazakov
2007-01-30 16:55 ` Jean-Pierre Rosen
2007-01-30 17:35   ` Ali Bendriss
2007-02-01 16:28   ` Ali Bendriss
2007-02-01 17:27     ` Jean-Pierre Rosen
2007-01-30 17:56 ` Jeffrey R. Carter
2007-01-30 18:04   ` frikk
2007-01-30 19:56     ` frikk
2007-01-31 18:30       ` Jeffrey R. Carter
2007-01-30 20:51     ` Robert A Duff
2007-01-31 18:25     ` Jeffrey R. Carter
2007-01-31 18:57       ` frikk
2007-01-30 19:31 ` Niklas Holsti
2007-01-30 21:14   ` Cesar Rabak
2007-01-30 21:36     ` frikk
2007-02-01 21:11   ` Simon Wright
2007-02-01 21:44     ` Niklas Holsti
2007-02-03 12:13       ` Simon Wright
2007-02-03 14:59         ` Gautier
2007-02-03 17:01           ` Simon Wright
2007-01-30 20:02 ` Martin Dowie
2007-01-30 20:09   ` frikk
2007-01-30 20:23     ` Martin Dowie
2007-01-31  3:54 ` Steve
2007-01-31  8:42   ` Maciej Sobczak
2007-01-31 14:12   ` frikk
2007-01-31 18:38     ` frikk [this message]
2007-02-01  0:05       ` Jeffrey R. Carter
2007-02-01  2:59       ` Steve
2007-02-01 16:05         ` Bob Spooner
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox