From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,FORGED_GMAIL_RCVD, FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: 103376,2aaba1527862ef22 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news2.google.com!postnews.google.com!q2g2000cwa.googlegroups.com!not-for-mail From: "frikk" Newsgroups: comp.lang.ada Subject: Re: Reading Float Data from a binary file into ada Date: 31 Jan 2007 10:38:19 -0800 Organization: http://groups.google.com Message-ID: <1170268699.548152.214890@q2g2000cwa.googlegroups.com> References: <1170172307.292500.256090@m58g2000cwm.googlegroups.com> <1170252776.235803.122220@j27g2000cwj.googlegroups.com> NNTP-Posting-Host: 12.129.98.129 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-Trace: posting.google.com 1170268704 28973 127.0.0.1 (31 Jan 2007 18:38:24 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Wed, 31 Jan 2007 18:38:24 +0000 (UTC) In-Reply-To: <1170252776.235803.122220@j27g2000cwj.googlegroups.com> User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322),gzip(gfe),gzip(gfe) X-HTTP-Via: 1.1 TRY0PX01 Complaints-To: groups-abuse@google.com Injection-Info: q2g2000cwa.googlegroups.com; posting-host=12.129.98.129; posting-account=192wHg0AAAAzciSzoZsEBI9bw5pVCopO Xref: g2news2.google.com comp.lang.ada:8785 Date: 2007-01-31T10:38:19-08:00 List-Id: On Jan 31, 9:12 am, "frikk" wrote: > On Jan 30, 10:54 pm, "Steve" wrote: > > > > > > > "frikk" 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