java: writing integers to file as unsigned 8 bit integer

integer, java, unsigned

Solution

Signed vs. unsigned is only a matter of how the bit patterns are interpreted, not the bit patterns themselves.

So if as long as your integers are in the range `0` to `255`, you can just jam them into bytes and write the bytes to a file.

However, because Java interprets byte bit patterns as being signed, you have to be careful when reading them back in.

For example, say you have the integer `253`. This is (in full 32-bit form):

00000000000000000000000011111101

If you do:

int i = 253;
byte b = (byte) i;

then `b` will contain the bits:

11111101

If you ask Java to use this, Java will claim it is `-3` because when interpreting bits as signed, `-3` is represented as the pattern `11111101`. And so if you write that byte to a file, the bits `11111101` will be written out, as desired.

Likewise, when you read it back in to a byte when reading the file, the byte you read it into will be filled with the bit pattern `11111101` which, again, Java will interpret as `-3`. So you cannot just do:

byte b = readByteFromFile();
int i = b;

because Java will interpret `b`'s contents as `-3` and give you the integer that represents `-3` as a 32-bit integer, which will be:

11111111111111111111111111111101

Instead, you need to mask things off to make sure the integer you end up with is:

00000000000000000000000011111101

So,

byte b = readByteFromFile();
int i = (0x000000FF) & b;

Problem

In java, how do I write integers to a file so that they are unsigned 8 bit integers (within range 0 to 255) ? Is it enough that the numbers are of type int and within 0-255, or do I need to convert them to some other type first? I think it's just the same thing? But I'm not sure if something funny happens when they get placed in the file...

Original source