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

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); 

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

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

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

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

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

 ushort number = Convert.ToUInt16("3510"); byte upper = (byte) (number >> 8); byte lower = (byte) (number & 0xff); 

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

你可能想和它一起使用0x00FF

 byte lower = Convert.ToByte(number & 0x00FF); 

完整示例:

 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; 

不应该是:

 byte lower = (byte) ( number & 0xFF ); 

即使接受的答案符合问题,我认为它是不完整的,因为简单的事实是问题包含int而不是标题中的短,并且它在搜索结果中有误导性,并且我们知道C#中的Int32有32位因此4字节。 我将在这里发布一个在Int32使用的情况下有用的示例。 在Int32的情况下,我们有:

  1. LowWordLowByte
  2. LowWordHighByte
  3. HighWordLowByte
  4. HighWordHighByte。

因此,我创建了以下方法,用于将Int32值转换为小端hex字符串,其中每个字节通过空格与其他字节分开。 当您传输数据并希望接收器更快地进行处理时,这非常有用,他可以只拆分(“”)并将字节表示为独立的hex字符串。

 public static String IntToLittleEndianWhitespacedHexString(int pValue, uint pSize) { String result = String.Empty; pSize = pSize < 4 ? pSize : 4; byte tmpByte = 0x00; for (int i = 0; i < pSize; i++) { tmpByte = (byte)((pValue >> i * 8) & 0xFF); result += tmpByte.ToString("X2") + " "; } return result.TrimEnd(' '); } 

用法:

 String value1 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x927C, 4); String value2 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x3FFFF, 4); String value3 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x927C, 2); String value4 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x3FFFF, 1); 

结果是:

  1. 7C 92 00 00
  2. FF FF 03 00
  3. 7C 92
  4. FF。

如果我很难理解我创建的方法,那么以下可能是一个更容易理解的方法:

 public static String IntToLittleEndianWhitespacedHexString(int pValue) { String result = String.Empty; byte lowWordLowByte = (byte)(pValue & 0xFF); byte lowWordHighByte = (byte)((pValue >> 8) & 0xFF); byte highWordLowByte = (byte)((pValue >> 16) & 0xFF); byte highWordHighByte = (byte)((pValue >> 24) & 0xFF); result = lowWordLowByte.ToString("X2") + " " + lowWordHighByte.ToString("X2") + " " + highWordLowByte.ToString("X2") + " " + highWordHighByte.ToString("X2"); return result; } 

备注:

  1. 当然,uint pSize的内容可以有一个枚举,指定Byte,Word,DoubleWord
  2. 您可以转换为字符并执行您想要执行的任何操作,而不是转换为hex字符串并创建小端字符串。

希望这会对某人有所帮助!

要有点创造力

 [System.Runtime.InteropServices.StructLayout( System.Runtime.InteropServices.LayoutKind.Explicit )] public struct IntToBytes { [System.Runtime.InteropServices.FieldOffset(0)] public int Int32; [System.Runtime.InteropServices.FieldOffset(0)] public byte First; [System.Runtime.InteropServices.FieldOffset(1)] public byte Second; [System.Runtime.InteropServices.FieldOffset(2)] public byte Third; [System.Runtime.InteropServices.FieldOffset(3)] public byte Fourth; }