C#根据用户输入改变字节数组的部分

时间:2016-02-11 13:27:29

标签: c# arrays string user-input xbee

我使用以下代码发送API框架:

byte[] bytesToSend5 = new byte[] 
{ 
    0x7E, 0x00, 0x10, 0x01, 0x00, 0x13, 
    0xA2, 0x00, 0x40, 0xA6, 0x5E, 0x23, 
    0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04, 0x4D 
};
serialPort1.Write(bytesToSend5, 0, bytesToSend5.Length);

它像这样分开:

byte[] bytesToSend5 = new byte[] 
{ 
    5Startbits(won't change), 
    8IDbits(changes when a part of the device is swapped), 
    6determinationbits(tells the device what to do), 
    1checksumbit(calculated based on previous bits) 
};    

第一个代码示例适用于当前产品。无论出于何种原因,如果需要更改器件的一部分,它将无法工作,因为ID位不适合。 ID号码印在设备上,16位数字和字母,例如“0013A20043A25E86”。

我想要做的是创建一个文本框,用户可以在其中输入新的ID号,它将被上述字节数组中的相应位替换。

这是我尝试使用Array.Copy函数,尝试在文本框中显示结果 - 但未检测到任何更改。我尝试输入“1”“1,2,3”等以及实际ID“0013A20043A25E86”:

        string xbee_serienr = prop1_serienr.Text;
        byte[] front = { 0x7E, 0x00, 0x10, 0x17, 0x01 };
        byte[] back = { 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04 };
        string[] xbee = { xbee_serienr };
        byte[] combined = new byte[front.Length + xbee.Length + back.Length];
        Array.Copy(front, combined, front.Length);
        Array.Copy(back, 0, combined, 5, back.Length);
        var result = string.Join(",", combined.Select(x => x.ToString()).ToArray());
        OutputWindow.Text = result;

必须能够根据用户输入更改8ID位,并根据其余位计算最后一个校验和位。

我搜索了互联网并尝试了Array.copy,Concat等,但我没有取得任何进展。对此的任何指导或意见都将受到高度赞赏,即使这意味着指导我采取不同的方法。

编辑:

我现在在字节数组“result”中使用与下面大致相同的示例获得所需信息(获取var“xbee_serienr”的用户输入)。我现在想把它传递给一个看起来像这样的方法:

    private void button_D07_Lav_Click(object sender, EventArgs e)
    {
        byte[] bytesToSend5 = new byte[] { 0x7E, 0x00, 0x10, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0xA6, 0x5E, 0x23, 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04, 0x4D };
        serialPort1.Write(bytesToSend5, 0, bytesToSend5.Length);

并使“bytesToSend5”使用来自其他方法的数组“result”。

我尝试过使用this示例,如下所示:

byte result { get; set; } //above and outside of the two methods

var result = string.Join(string.Empty, combined.Select(x => x.ToString("X2")).ToArray()); //this is the end of the first method

private void button_D07_Lav_Click(object sender, EventArgs e)
    {
        byte[] bytesToSend5 = new byte[] { 0x7E, 0x00, 0x10, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0xA6, 0x5E, 0x23, 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04, 0x4D };
        bytesToSend5 = result; //using the array stored in result instead of the one currently in bytesToSend5.
        serialPort1.Write(bytesToSend5, 0, bytesToSend5.Length);
    }

我在这里意识到明显的问题,它不是在同一个形式上。这就是为什么我想拆分数组并在数组中的每个项目前添加0x,并用逗号分隔它们。

一旦我弄清楚了,我也会将它用于几个不同的设备,这让我担心会有很多重复的代码,但我怀疑一旦我理解了如何传递和使用数组在不同的方法中,我总是可以“复制”每个设备的代码,因为不同设备的ID确实需要不同。

1 个答案:

答案 0 :(得分:1)

好吧,你永远不会添加解析后的字符串。

var xbee_serienr = "0013A20043A25E86";
byte[] front = { 0x7E, 0x00, 0x10, 0x17, 0x01 };
byte[] back = { 0xFF, 0xFE, 0x02, 0x44, 0x37, 0x04 };
var xbee = new byte[xbee_serienr.Length / 2];

for (var i = 0; i < xbee.Length; i++)
{
  xbee[i] = byte.Parse(xbee_serienr.Substring(i * 2, 2), NumberStyles.HexNumber);
}

byte[] combined;
using (var ms = new MemoryStream(front.Length + xbee.Length + back.Length))
{
  ms.Write(front, 0, front.Length);
  ms.Write(xbee, 0, xbee.Length);
  ms.Write(back, 0, back.Length);

  combined = ms.ToArray();
}

var result = string.Join(string.Empty, combined.Select(x => x.ToString("X2")).ToArray());

由于您要逐个添加多个数组,我只使用了MemoryStream。如果你已经准备好byte[](并且可变),你可以直接写入该字节数组并避免分配(和收集)额外的数组,但是当限制因素是限制因素时,它并没有多大区别。用户界面无论如何。