Convert a ushort value into two byte values in C#
Solution 1
0x0000000011111111
is not a binary number, it's a hex number. You need to use 0x0ff
instead.
However, since the result is a byte and casting to a byte will discard the upper bits anyway, you don't actually need to and
the result. You can just do this:
array[0] = (byte)package.FrameID;
array[1] = (byte)(package.FrameID >> 8);
(That's assuming that you are not using checked
code. If you are, then casting a value greater than 255 to a byte
will cause an exception. You will know if you are using checked
code.)
Solution 2
Use BitConverter
var bytes = BitConverter.GetBytes(package.FrameID);
Related videos on Youtube
user2071938
Updated on June 04, 2022Comments
-
user2071938 almost 2 years
How do I split a ushort into two byte variables in C#?
I tried the following (package.FrameID is ushort):
When I try to calculate this with paper&pencil I get the right result. Also, if FrameID is larger than a byte (so the second byte isn't zero), it works.
array[0] = (byte)(0x0000000011111111 & package.FrameID); array[1] = (byte)(package.FrameID >> 8);
In my case package.FrameID is 56 and the result in array[0] is 16 instead of 56.
How can I fix this?
-
user2071938 over 10 yearsThanks alot! But any Idea whats the problem with my solution?
-
EZI over 10 years@user2071938
0x0000000011111111
is a 8-byte hex number. They are not bits as you think. it should be0x00ff
-
King King over 10 years@user2071938 1 hex digit stands for 4 bits, so 1 byte will correspond to 2 hex digits.
-
King King over 10 years
0x0f
is 1 byte, if we perform abit and
operation on it and theushort
, the return value is only the lower-nibble of the lower byte, I think it's0x00ff
. -
Matthew Watson over 10 years@KingKing Thanks, fixed the typo
-
Jeppe Stig Nielsen over 10 yearsThis is the best solution. Regarding the constant
0x0000000011111111
, it seems to be an 8-byte number (16 hex digits), but since the leading 8 hex digits are all zero, it is interpreted as a 4-byte number. And since the first non-zero digit (1
) is between1
and7
, not between8
andf
, this is anint
, not auint
. You can tryvar a = 0x11223344;
(int
),var b = 0x81223344;
(uint
),var c = 0x112233448899aabb;
(long
),var d = 0x812233448899aabb;
(ulong
). -
Lonefish over 4 yearsYou could also use
0x0000000011111111
if you wanted to use the binary number (notice leading 0b instead of 0x)