Re: java & endianness [Re: Binary tx format for an array?] - Mailing list pgsql-jdbc

From Mark Lewis
Subject Re: java & endianness [Re: Binary tx format for an array?]
Date
Msg-id 1152548310.30994.260.camel@archimedes
Whole thread Raw
In response to java & endianness [Re: Binary tx format for an array?]  (Marc Herbert <Marc.Herbert@continuent.com>)
List pgsql-jdbc
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

pgsql-jdbc by date:

Previous
From: "Charles Curi"
Date:
Subject: Encod again
Next
From: Marc Herbert
Date:
Subject: Re: java & endianness [Re: Binary tx format for an array?]