我正在使用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
Run Code Online (Sandbox Code Playgroud)
我创建了一个大小为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());
}
Run Code Online (Sandbox Code Playgroud)
但它也删除了0x00索引,它可能是有用的数据......
如何删除未包含非零数据的0(尾随0)?
Dar*_*rov 11
您应该修复从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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常短而快速的函数,可以从数组中修剪尾随零.
public static byte[] TrimEnd(byte[] array)
{
int lastIndex = Array.FindLastIndex(array, b => b != 0);
Array.Resize(ref array, lastIndex + 1);
return array;
}
Run Code Online (Sandbox Code Playgroud)
有一个很好的单行解决方案纯 LINQ :
public static byte[] TrimTailingZeros(this byte[] arr)
{
if (arr == null || arr.Length == 0)
return arr;
return arr.Reverse().SkipWhile(x => x == 0).Reverse().ToArray();
}
Run Code Online (Sandbox Code Playgroud)