从byte 中删除尾随零?

我正在使用TCP协议并从套接字读取并将数据写入byte []数组。
以下是我的数据示例:

94 39 E5 D9 32 83 D8 5D 4C B1 CB 99 08 00 45 00 00 98 41 9F 40 00 6C 06 9C 46 26 50 48 7D C0 A8 01 05 03 28 

我创建了一个大小为1024的byte []数组。现在我使用此方法从中删除空索引:

 public void Decode(byte[] packet) { byte[] temp; int c = 0; foreach(byte x in packet) if (x != 0) c++; temp = new byte[c]; for (int i = 0; i < c; i++) temp[i] = packet[i]; MessageBox.Show(temp.Length.ToString()); } 

但它也删除了0x00索引,它可能是有用的数据……
如何删除未包含非零数据(尾随0)的0?

您应该修复从TCP套接字读取的代码,这样您就不会读取之后要丢弃的内容。 这对我来说似乎是一种浪费。

但要回答你的问题,你可以开始按相反的顺序计数,直到你遇到一个非零字节。 确定此非零字节的索引后,只需从源数组复制到目标数组:

 public byte[] Decode(byte[] packet) { var i = packet.Length - 1; while(packet[i] == 0) { --i; } var temp = new byte[i + 1]; Array.Copy(packet, temp, i + 1); MessageBox.Show(temp.Length.ToString()); return temp; } 

这是一个非常简短的快速函数,可以从数组中修剪尾随零。

 public static byte[] TrimEnd(byte[] array) { int lastIndex = Array.FindLastIndex(array, b => b != 0); Array.Resize(ref array, lastIndex + 1); return array; } 

由于无法按定义缩小数组大小,因此必须使用动态数据结构。

以List为例

 List byteList; 

迭代你的字节数组并将每个值!= 0添加到byteList。 当你到达byteArray中的数据末尾时,打破迭代并丢弃数组并从现在开始使用byteList。

 for (int i = 0; i <= byteArray.Length; i++) { if (byteArray[i] != 0) { byteList.Add(byteArray[i]); } else { break; } } 

如果您想使用数组,可以直接从列表中创建一个数组

 byte[] newByteArray = byteList.ToArray(); 

所以你想在最后修剪0x00并将其复制到一个新的数组中? 那将是:

 int endIndex = packet.Length - 1; while (endIndex >= 0 && packet[endIndex] == 0) endIndex--; byte[] result = new byte[endIndex + 1]; Array.Copy(packet, 0, result, 0, endIndex + 1); 

虽然当然可能在某种程度上也有某种有效的0x00秒。

实际上在MSDN网站上给出了非常接近的例子。 真的是C#4.5风格 – 带Predicate 。 您可以尝试(如果您已经提交了正确答案)

MSDN:谓词委托

PS我还在等待Linq风格的回答,最后是Select().ToList()

 Byte[] b = new Byte[1024]; // Array of 1024 bytes List byteList; // List of bytes // TODO: Receive bytes from TcpSocket into b foreach(var val in b) // Step through each byte in b { if(val != '0') // Your condition { } else { bytelist.Add(val); //Add the byte to the List } } bytelist.ToArray(); // Convert the List to an array of bytes