This approach looks like it&#39;d work just fine.<br><br><div class="gmail_quote">On Fri, May 15, 2009 at 2:16 AM, John Lato <span dir="ltr">&lt;<a href="mailto:jwlato@gmail.com">jwlato@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
leimy2k:<br>
<div><div></div><div class="h5">&gt; On Thu, May 14, 2009 at 8:46 PM, Don Stewart &lt;<a href="mailto:dons@galois.com">dons@galois.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; leimy2k:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Thu, May 14, 2009 at 8:40 PM, Don Stewart &lt;<a href="mailto:dons@galois.com">dons@galois.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     leimy2k:<br>
&gt;&gt; &gt;     &gt; I actually need little endian encoding... wondering if anyone else<br>
&gt;&gt; hit<br>
&gt;&gt; &gt;     this<br>
&gt;&gt; &gt;     &gt; with Data.Binary. (because I&#39;m working with Bell Lab&#39;s 9P protocol<br>
&gt;&gt; which<br>
&gt;&gt; &gt;     does<br>
&gt;&gt; &gt;     &gt; encode things on the network in little-endian order).<br>
&gt;&gt; &gt;     &gt;<br>
&gt;&gt; &gt;     &gt; Anyone got some &quot;tricks&quot; for this?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     Yes!<br>
&gt;&gt; &gt;     There are big, little and host-endian primitives in the Get/Put<br>
&gt;&gt; monads.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; <a href="http://hackage.haskell.org/packages/archive/binary/0.5.0.1/doc/html/" target="_blank">http://hackage.haskell.org/packages/archive/binary/0.5.0.1/doc/html/</a><br>
&gt;&gt; &gt;     Data-Binary-Put.html#v%3AputWord16le<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     You can use these to build encoders directly.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Cool... I just have to write my own encoder and decoder now.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; As a request could we get encodeLe decodeLe for a later version of this<br>
&gt;&gt; &gt; library?  :-)  That&#39;d be totally awesome.<br>
&gt;&gt;<br>
&gt;&gt; Oh, you mean entirely different instances for all the current ones, that<br>
&gt;&gt; use LE encodings?<br>
&gt;&gt;<br>
&gt;<br>
&gt; Well the library is leaning towards &quot;Network Byte Order&quot; in that it has<br>
&gt; encode/decode that only encode/decode for Big Endian.<br>
&gt;<br>
&gt; Us folks who have to do little endian all now have to write our own<br>
&gt; encoding/decoding :-)<br>
&gt;<br>
</div></div><div class="im">&gt; I&#39;m speaking specifically of the encode/decode functions.  I have no idea<br>
&gt; how they&#39;re implemented.<br>
<br>
</div>The encode/decode functions just call the runGet/runPut functions for<br>
whatever is being encoded or decoded to combined with the get/put<br>
functions from the Binary instance.  The endian-ness is entirely<br>
determined by the Binary instance for the data type you&#39;re<br>
encoding/decoding, not anything in the encode/decode functions<br>
themselves.<br>
<br>
For data types you define, you can make the Binary instance LE<br>
standard (although it may not be a good idea) by using the<br>
little-endian primitives Don mentioned.  For built-in types, if you<br>
want to use a different endian-ness, you can make new get/put<br>
functions then call runGet/runPut on those directly.  You won&#39;t be<br>
able to redefine the Binary instances, but if you&#39;ll be doing this<br>
with a lot of different types you could make your own BinaryLE class<br>
like this:<br>
<br>
class BinaryLE t where<br>
  putLE :: t -&gt; Put<br>
  getLE :: Get t<br>
<br>
encodeLE :: BinaryLE a =&gt; a -&gt; ByteString<br>
encodeLE = runPut . putLE<br>
<br>
decodeLE :: BinaryLE a =&gt; ByteString -&gt; a<br>
decodeLE = runGet getLE<br>
<br>
I&#39;ve done some work with Binary and little-endian, and this bias never<br>
really bothered me (I think it&#39;s actually a host-endian bias, could be<br>
mistaken).  I was using my own data types so I had to make my own<br>
custom Binary instances, which I would have had to do anyway.  The<br>
data format specified little-endian, so making the Binary instance<br>
LE-standard seemed appropriate.<br>
<br>
You&#39;d only need to re-make custom get/put functions if you&#39;re using<br>
types that already have Binary instances, and you intend to manipulate<br>
the data outside of Haskell.  Does that describe your situation?<br>
<font color="#888888"><br>
John<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>