On Mon, 2006-07-10 at 11:19 +0200, Marc Herbert wrote:
> Mark Lewis <mark.lewis@mir3.com> writes:
>
> > Java tried so hard to hide endianness from you that it didn't provide
> > any real support for those times when you DO need to be aware of it.
>
> Could you give sample cases when you DO need it? I don't think that
> many people write hardware drivers in Java ;-)
Any time you're working with network protocols, as was the case with
this example here. Try to send a 32-bit integer over the network, for
the other end to receive it correctly, it needs to be in the byte-order
the client expects.
> I don't think network communication qualifies either, see below.
>
>
> > So the "convention" looks kind of like this (snipped from the PG JDBC
> > driver):
> >
> > public void SendInteger4(int val) throws IOException
> > {
> > SendChar((val >> 24)&255);
> > SendChar((val >> 16)&255);
> > SendChar((val >> 8)&255);
> > SendChar(val&255);
> > }
>
> This code is like copied/pasted from the JDK:
>
> * @since JDK1.0
> DataOutputStream#writeInt()
>
>
> Any reason for duplicating it in the driver?
Well, in the general case you can only use DataOutputStream's writeInt()
method if everything is in big-endian byte order, which is true in this
case but not universally so. Here it IS big-endian, so the choice is
between duplicating one method a few lines long, or wrapping the main
OutputStream in an extra DataOutputStream which would only be used when
writing big-endian integers. Not sure if one solution is better than
the other.
> > There finally were endian-aware buffer operations added in JDK 1.4,
>
> Could you detail which ones? Thanks in advance.
It's in the java.nio stuff, look at the javadoc for ByteBuffer.order()
for a starting point.
-- Mark