Удалить завершающие нули из байта []?

Я работаю с протоколом 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

Я создал массив byte [] размером 1024. Теперь я использую этот метод для удаления из него нулевых индексов:

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)?

 marc wellman29 июн. 2012 г., 16:08
что вы имеете в виду с нулевыми индексами?
 Soroush Khosravi29 июн. 2012 г., 16:08
@ Гарольд, потому что порядок очень важен для меня ...
 harold29 июн. 2012 г., 16:07
Как вы можете определить, является ли ноль "полезным"? или нет?
 Darin Dimitrov29 июн. 2012 г., 16:11
Индекс не может быть нулевым в массиве. Ни значение, потому чтоbyte это тип значения Вы хотите удалить значения 0x00 из массива?
 Tim S.29 июн. 2012 г., 16:20
Когда ваш байт [] заполнен, вы должны где-нибудь получить значение, сообщающее, сколько байтов было прочитано (в настоящее время это, вероятно, возвращаемое значение изRead метод, который игнорируется). Вы должны использовать это, чтобы изменить размер массива, а не просто обрезать 0 до конца.

Ответы на вопрос(6)

0x00s в конце и скопировать его в новый массив? Это было бы:

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в конце тоже.

вам придется вместо этого использовать динамическую структуру данных.

Используйте список для примера

List<byte> byteList;

Переберите свой байтовый массив и добавьте каждое значение! = 0 в список байтов. Когда вы достигли конца данных в вашем byteArray, прервите итерацию и отбросьте массив, и теперь используйте byteList.

for (int i = 0; i <= byteArray.Length; i++) {

    if (byteArray[i] != 0) {

        byteList.Add(byteArray[i]);
    } else {

         break;
    }

}

Если вы хотите использовать массив, вы можете создать его прямо из списка

byte[] newByteArray = byteList.ToArray();
 29 июн. 2012 г., 16:26
конечно, вы правы :) Но я не буду удалять пост, возможно, он даст ему представление о том, как использовать Список ..
 29 июн. 2012 г., 16:23
Это остановится на первых 0 байтах и может потенциально обрезать ненулевые байты впоследствии. OP хочет удалить только последовательные нулевые байты в конце массива.
Решение Вопроса

который читает из сокета 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;
}
 Soroush Khosravi29 июн. 2012 г., 16:30
Спасибо за полный код ...
 11 нояб. 2014 г., 10:56
Спасибо, это работает для меня.

тельно стиль C # 4.5 - сPredicate<T>, Вы можете попробовать, если хотите (хотя правильный ответ уже был представлен)

MSDN: предикатный делегат

Постскриптум Я все еще жду ответа в стиле Linq сSelect() а также.ToList<byte[]>() в конце

Byte[] b = new Byte[1024]; // Array of 1024 bytes

List<byte> byteList; // List<T> 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
 22 мар. 2015 г., 15:30
Не могли бы вы отформатировать код и кратко объяснить его?

з массива.

public static byte[] TrimEnd(byte[] array)
{
    int lastIndex = Array.FindLastIndex(array, b => b != 0);

    Array.Resize(ref array, lastIndex + 1);

    return array;
}

Ваш ответ на вопрос