Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Concatenating bytes into integer or short preserving sign

Tags:

c#

I know I can extract bytes from int like this:

bytes[] IntToBytes(int i)
{
  return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)};
}

which I subsequently send as part of a serial transmission. But can I do the reverse, after receiving a sequence of bytes, reconstruct the original data, preserving the sign. Currently, I do this, but it feels a bit over the top:

int BytesToInt( byte hi, byte lo)
{
  return ((hi << 24) | (lo << 16)) >> 16;
}

Is there another way or a better way? Does it make a difference if I know I am ultimately dealing with signed 16-bit data only?

like image 254
Graham Avatar asked Apr 15 '15 14:04

Graham


1 Answers

You're working with signed 16-bit data only. So why are you passing (and returning) an int and not a short? You're throwing the sign information away, so it will not actually work for negative numbers. Instead, use short and you'll be fine - and the extra type information will make your code safer.

byte[] ShortToBytes(short i)
{
  return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)};
}

short BytesToShort(byte hi, byte lo)
{
  return unchecked((short)((hi << 8) | lo));
}

The main benefit (apart from being clearer and actually working) is that you can no longer pass an invalid value to the method. That's always good :)

Oh, and I'd recommend keeping the interface symmetric - BytesToShort should also take a byte[] (or some other structure that has the two bytes).

like image 116
Luaan Avatar answered Sep 23 '22 10:09

Luaan