Good way to convert between short and bytes?
Solution 1
Shorter version (also shifting 8 bits instead of 4):
static short ToShort(short byte1, short byte2)
{
return (byte2 << 8) + byte1;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
byte2 = (byte)(number >> 8);
byte1 = (byte)(number & 255);
}
Solution 2
Use BitConverter
short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);
Solution 3
Bytes are 8 bits, not 4, so your shifting is off. You also declared local variables in the second function so you wouldn't end up writing the the out
parameters like you intend. It's also clearer/better if you limit yourself to bitwise operations (&
, |
, and ~
) where possible.
static short ToShort(byte byte1, byte byte2)
{
return (short) ((byte2 << 8) | (byte1 << 0));
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
byte2 = (byte) (number >> 8);
byte1 = (byte) (number >> 0);
}
Note that the left and right shifts by zero are unnecessary, strictly speaking. I just put those in for symmetry. Also, personally I'd recommend you just learn bitwise arithmetic cold and skip writing helper functions like these. No need to hide the details with something so fundamental, IMHO.
Solution 4
If you want to take bytes... take bytes; and your shifts are off, and |
would be more intuitive:
static short ToShort(byte byte1, byte byte2)
{ // using Int32 because that is what all the operations return anyway...
return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
byte2 = (byte)number;
}
Comments
-
RCIX almost 2 years
I need to take pairs of bytes in, and output shorts, and take shorts in and output pairs of bytes. Here are the functions i've devised for such a purpose:
static short ToShort(short byte1, short byte2) { short number = (short)byte2; number <<= 4; number += (short)byte1; return number; } static void FromShort(short number, out byte byte1, out byte byte2) { byte byte2 = (byte)(number >> 4); short tempByte = (short)byte2 << 4; byte byte1 = (byte)(number - tempByte); }
I think this is correct but i'm not sure. If this isn't the right way to do it, what is? is there a way to do this already in the framework?
-
RCIX over 14 yearsthat taking bytes thing was actually a mistake... Good tips though, thanks!
-
RCIX over 14 yearshad to wrap the code in the ToShort method with a cast to short, just thought i'd let you know...
-
RCIX over 14 yearsHmm didn't think of this but i like Ates' slution for now. Thanks!
-
TJB over 14 yearsWhatever works best for you! The upside of using a method like this is that if you have to use this code in other projects it will just be there instead of having to create a library and share code. Also, other developers can re-user their knowledge of BitConverter if they have any. Personally, we used to have some wrapper code for byte conversions we would share, but it became more of a hassle to maintain rather than just use the built in stuff. But seriously, use what works best for you ; )
-
Ken Smith over 13 yearsYou'll typically want to bit shift byte2, not byte1. So something like: return (short)((byte2<<8) | byte1);
-
Lama over 11 yearsThis is the only solution I'd recommend.
-
Yiping over 8 yearsThis is the only solution that is correct for signed short
-
Assimilater almost 7 yearsthis doesn't compile...why so many upvotes? short + short resolves to an integer operator and cannot implicitly cast int as short
-
Ates Goral almost 7 years@Assimilater In which compiler?
-
Assimilater almost 7 yearsMicrosoft Visual C# compiler targeting .NETv4.5.2...does it depend on .NET version?
-
Assimilater almost 7 yearsAs a c/c++ programmer at heart I find it silly that anyone would find it burdensome to do a simple bitshift and or operation...generating a
byte[]
and then howeverBitConverter
is implemented to parse saidbyte[]
afterwards just seems silly.... -
Assimilater almost 7 yearscasting as a short is required in
ToShort
just before returning. See answer by @john-kugelman -
Assimilater almost 7 yearsthough the int casts are unnecessary it shows what will happen anyways (and I think this is what you meant by the comment), so +1
-
Rafael Diego Nicoletti over 4 yearsI think BitConverter would consider big endian/little endian scenarios.
-
Farid over 2 yearsI just tested this method I don't know why it is returning wrong number after double conversion. Providing
36999
then doingFromShort
and then converting it to back to short withToShort
the result becomes65415