noob stuck on reading double
John Machin
sjmachin at lexicon.net
Tue Jan 29 15:29:31 EST 2008
[I can't see Hannah's posting(s) with my news client (Thunderbird), nor
with Google Groups]
Joe Riopel wrote:
> Since you're unpacking it with the 'd' format character I am assuming
> a "doubleword" field is a double.
Given Hannah has sensibly stated up front that she is a noob, I would
assume nothing from her code.
Given "doubleword" is Intel/MS-speak for "32-bit quantity", and
following the strong hint of repeat-every-4-bytes from the printed
gibberish (e.g. "Q???Q???Q???Q???Q?") I'd *guess* that a "doubleword" is
a signed or unsigned 32-bit integer. Now let's check the guess:
> You said you had 113 of them in the
> binary file.
There are about 170 bytes of gibberish, that I saw in Joe's second
reply. Hannah, don't do:
print gibberish
do:
print len(gibberish), repr(gibberish)
What is the size of the file? 4 * 113 -> 452, 8 * 113 = 904
> You should be doing something like this:
>
> file = open('data.bin', 'rb')
don't shadow the 'file' built-in function
> file.seek(0)
where else would it be positioned???
> raw = file.read()
> unpacked = unpack('113d', raw)
> for i in range(0,113):
> print unpacked[i]
> file.close()
I suggest that Hannah try something like this:
from struct import unpack
f = open('data.bin', 'rb')
raw = f.read()
nbytes = len(raw)
print 'nbytes', nbytes
print '32-bit signed integer', unpack('<%di' % (nbytes // 4), raw)
print '32-bit unsigned integer', unpack('<%dI' % (nbytes // 4), raw)
print '64-bit floating point', unpack('<%dd' % (nbytes // 8), raw)
and choose depending on what output best meets her expectations.
Note: the "<" in the above is another guess based on "doubleword" ->
Intel -> little-endian. If struct.unpack is unhappy or if all three
results look like rubbish, change the "<" to a ">" and try again ... if
in doubt, come back for more advice. If you do, please include the
output from starting Python at the shell prompt and peeking at
sys.byteorder -- this i swhat that produces on my machine:
C:\junk>python
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys; sys.byteorder
'little'
>>>
HTH,
John
More information about the Python-list
mailing list