从byte []中删除尾随零?

Sor*_*avi 2 c# arrays 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
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)


nef*_*rel 9

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

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)


IFi*_*ink 5

有一个很好的单行解决方案纯 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)