在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?
Posted
技术标签:
【中文标题】在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?【英文标题】:Getting upper and lower byte of an integer in C# and putting it as a char array to send to a com port, how? 【发布时间】:2011-07-22 03:00:18 【问题描述】:在 C 中我会这样做
整数 = 3510;
字符上限 = 数字 >> 8;
char lower = number && 8;
发送字节(上);
发送字节(下);
upper 和 lower 都 = 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 中,上 = 13 下 = 0 这是没有意义的,如果我将代码更改为 >> 6 upper = 54 这绝对是奇怪的。
基本上我只是想从16位数字中获取高低字节,并在“GETDM”之后发送到com端口
我该怎么做?在 C 中它是如此简单,但在 C# 中我完全被难住了。
【问题讨论】:
【参考方案1】:您的掩码不正确 - 您应该针对 255 (0xff) 而不是 8 进行掩码。移位是根据“要移位的位”进行的,而按位和/或对要掩码的值起作用...所以如果您只想保留底部 8 位,您需要一个仅设置底部 8 位的掩码 - 即 255。
请注意,如果您想将一个数字拆分为两个字节,那么它实际上应该是一个 short 或 ushort,而不是 int
(它有 四个 个字节)。
ushort number = Convert.ToUInt16("3510");
byte upper = (byte) (number >> 8);
byte lower = (byte) (number & 0xff);
请注意,我在这里使用了ushort
而不是byte
,因为当您不需要担心符号扩展时,按位算术更容易考虑。由于缩小转换为byte
的工作方式,在这种情况下实际上并不重要,但这是您应该考虑的事情。
【讨论】:
byte lower = (byte) number;
也应该这样做
@NikitaBrizhak:是的,但我发现上面的方法更容易考虑:)【参考方案2】:
你可能想和它一起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;
【讨论】:
【参考方案3】:即使接受的答案符合问题,我也认为它不完整,因为问题包含 int 并且标题中不短并且它在搜索结果中具有误导性,并且我们知道 C# 中的 Int32 有 32 位和因此 4 个字节。我将在此处发布一个示例,该示例在使用 Int32 的情况下很有用。对于 Int32,我们有:
-
LowWordLowByte
LowWordHighByte
HighWordLowByte
HighWordHighByte。
因此,我创建了以下方法,用于将 Int32 值转换为小端十六进制字符串,其中每个字节由空格分隔。当您传输数据并希望接收器更快地进行处理时,这很有用,他只需 Split(" ") 并将字节表示为独立的十六进制字符串。
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);
结果是:
-
7C 92 00 00
FF FF 03 00
7C 92
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;
备注:
-
当然,除了 uint pSize 之外,还可以有一个枚举来指定 Byte、Word、DoubleWord
您可以转换为字符并执行您想做的任何事情,而不是转换为十六进制字符串并创建小端字符串。
希望这会对某人有所帮助!
【讨论】:
【参考方案4】:不应该是:
byte lower = (byte) ( number & 0xFF );
【讨论】:
【参考方案5】:更有创意
[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;
【讨论】:
请注意,这不是字节序干净的。以上是关于在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?的主要内容,如果未能解决你的问题,请参考以下文章
使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组
如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组