在C#中将ushort值转换为两个字节值

use*_*938 1 c# byte boolean-logic ushort

如何在C#中将ushort分成两个字节变量?

我尝试了以下(package.FrameID是ushort):

当我尝试用纸和笔来计算时,我得到了正确的结果.此外,如果FrameID大于一个字节(因此第二个字节不为零),它就可以工作.

array[0] = (byte)(0x0000000011111111 & package.FrameID);
array[1] = (byte)(package.FrameID >> 8);
Run Code Online (Sandbox Code Playgroud)

在我的情况下,package.FrameID是56,array [0]中的结果是16而不是56.

我怎样才能解决这个问题?

EZI*_*EZI 11

使用BitConverter

var bytes = BitConverter.GetBytes(package.FrameID);
Run Code Online (Sandbox Code Playgroud)

  • @user2071938 `0x0000000011111111` 是一个 8 字节 **hex** 数字。它们并不像你想象的那样。它应该是“0x00ff” (2认同)

Mat*_*son 6

0x0000000011111111不是二进制数,它是十六进制数.你需要0x0ff改用.

但是,由于结果是一个字节,并且转换为字节将丢弃高位,无论如何您实际上不需要and结果.你可以这样做:

array[0] = (byte)package.FrameID;
array[1] = (byte)(package.FrameID >> 8);
Run Code Online (Sandbox Code Playgroud)

(假设您没有使用checked代码.如果是,那么将大于255的值转换为a byte将导致异常.您将知道您是否使用checked代码.)