在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?

rol*_*lls 10 c# bytearray bitmask bit-shift char

CI会这样做

int number = 3510;

char upper = number >> 8;

char lower = number && 8;

SendByte(上部);

SendByte(低级);

上下都是= 54

在C#我这样做:

            int number = Convert.ToInt16("3510");
            byte upper = byte(number >> 8);
            byte lower = byte(number & 8);
            char upperc = Convert.ToChar(upper);
            char lowerc = Convert.ToChar(lower);
            data = "GETDM" + upperc + lowerc;
            comport.Write(data);
Run Code Online (Sandbox Code Playgroud)

但是在调试器编号= 3510,upper = 13和lower = 0这没有任何意义,如果我将代码更改为>> 6 upper = 54这绝对是奇怪的.

基本上我只想从16位数字中获取上下字节,并在"GETDM"之后将其发送到com端口

我怎样才能做到这一点?它在C语言中非常简单,但在C#中我完全被难倒了.

Jon*_*eet 34

你的屏蔽是不正确的 - 你应该屏蔽255(0xff)而不是8.移位工作的方法是"按位移位",而按位和/或反对该值来屏蔽...所以如果你只想保持最低8位,你需要一个只有底部8位设置的掩码 - 即255.

请注意,如果您尝试将一个数字拆分为两个字节,那么它应该是一个简短的或者用来开始的,而不是一个int(有四个字节).

ushort number = Convert.ToUInt16("3510");
byte upper = (byte) (number >> 8);
byte lower = (byte) (number & 0xff);
Run Code Online (Sandbox Code Playgroud)

请注意,当您不需要担心符号扩展时,我在ushort这里使用而不是byte按位算术更容易思考.在这种情况下,由于缩小转换的方式byte起作用,实际上并不重要,但这是你应该考虑的事情.

  • `byte lower =(byte)number;`也应该这样做 (3认同)

SwD*_*n81 5

你可能想和它一起 0x00FF

byte lower = Convert.ToByte(number & 0x00FF);
Run Code Online (Sandbox Code Playgroud)

完整示例:

ushort number = Convert.ToUInt16("3510");
byte upper = Convert.ToByte(number >> 8);
byte lower = Convert.ToByte(number & 0x00FF);
char upperc = Convert.ToChar(upper);
char lowerc = Convert.ToChar(lower);
data = "GETDM" + upperc + lowerc;
Run Code Online (Sandbox Code Playgroud)