Hi Derby developers,

I'm staring at this code in NetworkServerControlImpl.java;

    private void writeShort(int value) throws Exception
    {
        try {
            commandOs.writeByte((byte)((value & 0xf0) >> 8 ));
            commandOs.writeByte((byte)(value & 0x0f));
        }
        catch (IOException e)
        {
            clientSocketError(e);
        }
    }

I'm not quite sure what this code is doing.

It seems to be mixing some combination of 8-bit shifting
and 4-bit value masking.

I think it might actually be losing/destroying 4 bits of
the 16-bit value (the high 4 bytes in the low byte of
the short).

For example if you call writeShort(23), it emits 0x00, 0x07,
when I think it should emit 0x00,0x17.

I suspect the code should read:

    private void writeShort(int value) throws Exception
    {
        try {
            commandOs.writeByte((byte)((value & 0xff00) >> 8 ));
            commandOs.writeByte((byte)(value & 0x00ff));
        }
        catch (IOException e)
        {
            clientSocketError(e);
        }
    }

or perhaps

    private void writeShort(int value) throws Exception
    {
        try {
            commandOs.writeByte((byte)((value >> 8 ));
            commandOs.writeByte((byte)value);
        }
        catch (IOException e)
        {
            clientSocketError(e);
        }
    }

or some such, but really I don't understand it at all.

And, very close to this code is a very similar method:

    private void writeByte(int value) throws Exception
    {
        try {
            commandOs.writeByte((byte)(value & 0x0f));
        }
        catch (IOException e)
        {
            clientSocketError(e);
        }
    }

which I think might be damaged for any value in the
range 17-255? It seems like it should probably be:

    private void writeByte(int value) throws Exception
    {
        try {
            commandOs.writeByte((byte)(value & 0xff));
        }
        catch (IOException e)
        {
            clientSocketError(e);
        }
    }

or maybe just:

    private void writeByte(int value) throws Exception
    {
        try {
            commandOs.writeByte((byte)value);
        }
        catch (IOException e)
        {
            clientSocketError(e);
        }
    }

The thing is, this is some VERY old code. It seems to go
back to the original donation from IBM, more than a
dozen years ago.

So I'm sure I'm just missing something basic.

Has anyone looked at this code before?

Am I just confused?

thanks,

bryan

Reply via email to