leimy2k:
> On Thu, May 14, 2009 at 8:46 PM, Don Stewart <d...@galois.com> wrote:
>
>> leimy2k:
>> >
>> >
>> > On Thu, May 14, 2009 at 8:40 PM, Don Stewart <d...@galois.com> wrote:
>> >
>> >     leimy2k:
>> >     > I actually need little endian encoding... wondering if anyone else
>> hit
>> >     this
>> >     > with Data.Binary. (because I'm working with Bell Lab's 9P protocol
>> which
>> >     does
>> >     > encode things on the network in little-endian order).
>> >     >
>> >     > Anyone got some "tricks" for this?
>> >
>> >     Yes!
>> >     There are big, little and host-endian primitives in the Get/Put
>> monads.
>> >
>> >
>> http://hackage.haskell.org/packages/archive/binary/0.5.0.1/doc/html/
>> >     Data-Binary-Put.html#v%3AputWord16le
>> >
>> >     You can use these to build encoders directly.
>> >
>> >
>> > Cool... I just have to write my own encoder and decoder now.
>> >
>> > As a request could we get encodeLe decodeLe for a later version of this
>> > library?  :-)  That'd be totally awesome.
>>
>> Oh, you mean entirely different instances for all the current ones, that
>> use LE encodings?
>>
>
> Well the library is leaning towards "Network Byte Order" in that it has
> encode/decode that only encode/decode for Big Endian.
>
> Us folks who have to do little endian all now have to write our own
> encoding/decoding :-)
>
> I'm speaking specifically of the encode/decode functions.  I have no idea
> how they're implemented.

The encode/decode functions just call the runGet/runPut functions for
whatever is being encoded or decoded to combined with the get/put
functions from the Binary instance.  The endian-ness is entirely
determined by the Binary instance for the data type you're
encoding/decoding, not anything in the encode/decode functions
themselves.

For data types you define, you can make the Binary instance LE
standard (although it may not be a good idea) by using the
little-endian primitives Don mentioned.  For built-in types, if you
want to use a different endian-ness, you can make new get/put
functions then call runGet/runPut on those directly.  You won't be
able to redefine the Binary instances, but if you'll be doing this
with a lot of different types you could make your own BinaryLE class
like this:

class BinaryLE t where
  putLE :: t -> Put
  getLE :: Get t

encodeLE :: BinaryLE a => a -> ByteString
encodeLE = runPut . putLE

decodeLE :: BinaryLE a => ByteString -> a
decodeLE = runGet getLE

I've done some work with Binary and little-endian, and this bias never
really bothered me (I think it's actually a host-endian bias, could be
mistaken).  I was using my own data types so I had to make my own
custom Binary instances, which I would have had to do anyway.  The
data format specified little-endian, so making the Binary instance
LE-standard seemed appropriate.

You'd only need to re-make custom get/put functions if you're using
types that already have Binary instances, and you intend to manipulate
the data outside of Haskell.  Does that describe your situation?

John
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to