byte[] GetErrorTemp = compareArr_Reply(data, 3, ElecThreshold, 0, 36);
为什么这句执行后GetErrorTemp 变量的值是null?
下面是compareArr_Reply函数的具体内容:
public static byte[] compareArr_Reply(byte[] arr1, int addr1, byte[] arr2, int addr2, int len)
{
List<byte> retList = new List<byte>();
int Error_Num = 0;
if (arr1.Length >= len - addr1 && arr2.Length >= len - addr2)
{
for (var i = 0; i < len; i++)
{
if (arr1[i + addr1] != arr2[i + addr2])
{
Error_Num++;
retList.Add((byte)i);
}
}
}
else
{
retList.Add(0xFF);
}
byte[] ret = new byte[retList.Count];
ret = retList.ToArray();
return ret;//此时ret = {0,12}
}
我们不知道你到底想干啥,无法给出明确建议。只是从代码猜测你要把 arr2的数据填充到arr1里面
我们现在其实有很多种方式完成,我下面展示一些
byte[] data = new byte[39];
byte[] ElecThreshold =new byte[36];
ElecThreshold[0] = 0x01;
ElecThreshold[35] = 0x02;
//直接把ElecThreshold数据copy到data里起始地址3,copy数量36
Array.Copy(ElecThreshold, 0, data, 3, 36);
//同等功能的函数还有
System.Buffer.BlockCopy(data,3,ElecThreshold,0,36);
Marshal.Copy(Marshal.UnsafeAddrOfPinnedArrayElement(ElecThreshold, 0), data, 3, 36);
//当然还有其他一些方式,比如下面这样我就不多赘述了
System.Buffers.ArrayBufferWriter<byte> writer = new ArrayBufferWriter<byte>();
writer.Write(new ReadOnlySpan<byte>(data,0,3));
writer.Write(new ReadOnlySpan<byte>(ElecThreshold,0,36));
经测试,不存在你说的情况
byte[] ret = new byte[retList.Count];
ret = retList.ToArray();
return ret;
//改成
return retList.ToArray();
这个代码是冗余的,先给它new了一个retList长度的空数组,又用retList转数组重新给它赋值。
不过这跟代码运行错误没有关系。
你代码运行出错,是因为data传入的有问题,或者函数报错了,或者你在代码执行之前就去取值造成的。
仔细debug,看每一步的结果到底是什么