What is the best way to work around the fact that ALL Java bytes are signed?

26,668

Solution 1

When reading any single value from the array copy it into something like a short or an int and manually convert the negative number into the positive value it should be.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

You can do a similar conversion when writing into the array.

Solution 2

It is actually possible to get rid of the if statement and the addition if you do it like this.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

This way Java doesn't interpret the byte as a negative number and flip the sign bit on the integer also.

Solution 3

Using ints is generally better than using shorts because java uses 32-bit values internally anyway (Even for bytes, unless in an array) so using ints will avoid unnecessary conversion to/from short values in the bytecode.

Share:
26,668
Max
Author by

Max

Site Reliability Engineer at Google I currently work on Storage products at Google, primarily Cloud Bigtable.

Updated on July 08, 2022

Comments

  • Max
    Max almost 2 years

    In Java, there is no such thing as an unsigned byte.

    Working with some low level code, occasionally you need to work with bytes that have unsigned values greater than 128, which causes Java to interpret them as a negative number due to the MSB being used for sign.

    What's a good way to work around this? (Saying don't use Java is not an option)