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

C#根据用户输入更改字节数组的部分,c#,arrays,string,user-input,xbee,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); 它是这样分开的:

我使用以下代码发送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”:

必须能够根据用户输入更改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”

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

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。

好吧,您永远不会添加解析的字符串

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());
var xbee_serienr=“0013A20043A25E86”;
字节[]前端={0x7E,0x00,0x10,0x17,0x01};
字节[]返回={0xFF,0xFE,0x02,0x44,0x37,0x04};
var xbee=新字节[xbee_serienr.Length/2];
对于(变量i=0;ix.ToString(“X2”)).ToArray();

因为要一个接一个地添加多个数组,所以我只使用了
MemoryStream
。如果您已经准备好了
byte[]
(并且是可变的),您可以直接写入该字节数组,避免分配(和收集)额外的数组,但是当限制因素是UI时,这并没有多大区别。

谢谢您的回答,这正是我一直在寻找的,很容易了解它是如何工作的。现在我假设我需要查看string.split以将字符串转换为“0x”格式,然后将字符串转换为字节数组。然后,我希望可以将字节数组作为参数传递给另一个方法。@KermitLover为什么要将
字节[]
转换为
字符串
,只是为了再次将其转换为
字节[]
?您已经有了
字节[]
。直接将它传递给另一个方法:)这是在windows应用程序窗体中,我还没有设法直接传递
byte[]
。如果你有兴趣,我会用这个问题更新我原来的帖子。
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());