在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,我们有:

    Lo​​wWordLowByte Lo​​wWordHighByte 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端口,如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C ++中将字节数组中的整数转换为数字

使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组

C# 记录麦克风输入并将其存储在字节数组中,而不是本地存储

如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组

NAudio C#:如何从 WaveInEventArgs 获取字节数组以进行进一步操作

如何获取整数的位数并将其存储到数组中? [关闭]