Re: Reading Single and Double reals in Little-endian and Big-endian
- To: mathgroup at smc.vnet.net
- Subject: [mg125175] Re: Reading Single and Double reals in Little-endian and Big-endian
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>
- Date: Sun, 26 Feb 2012 04:19:55 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jhldir$ot7$1@smc.vnet.net> <jhsu7g$np4$1@smc.vnet.net>
On Fri, 24 Feb 2012 06:02:04 -0000, ezh <dgolber at aol.com> wrote: > Yes, I need to reverse the byte order. After all, it's not a PC > storing the stuff read from the file, it's Mathematica. I see. Well, your problem is caused by the Utilities`BinaryFiles` package, which reads binary files in a fairly insane way and hard-codes an assumption of big-endianness when dealing with reals. This code was written over 20 years ago (in 1991) and is now well and truly obsolete. On the plus side, the package source (in AddOns/StandardPackages/Utilities/BinaryFiles.m) can be edited as you see fit, including to add support for little-endian reals. So, for example, in the package we find the following definition which provides for reading a single precision number: rb[stream_InputStream,Single,_] := floatvalue @@ {Quotient[#1,128], (Mod[#1,128])*2 + Quotient[#2,128], ((Mod[#2,128])*256^2 + #3*256 + #4)/(2^23) + 1}& @@ Read[stream,{Byte,Byte,Byte,Byte}] Reading the rest of the package source, we note that the third argument corresponds to endianness, with True meaning big-endian, and False, little-endian. So, we make the needed changes: rb[stream_InputStream,Single,bigendian_] := floatvalue @@ {Quotient[#1,128], (Mod[#1,128])*2 + Quotient[#2,128], ((Mod[#2,128])*256^2 + #3*256 + #4)/(2^23) + 1}& @@ If[bigendian,Identity,Reverse]@Read[stream,{Byte,Byte,Byte,Byte}] and, just like that, we have support for little-endian single precision numbers (or at least, I hope so--I didn't test this). Do the same for double precision numbers and you're finished updating the package. I hope this fixes your problem so that workarounds are no longer needed. However, I still think that using Import to start with rather than trying to read the file manually would have been easier, as well as avoiding this bizarre problem.