Вопрос по c#, byte, arrays – Удалить завершающие нули из байта []?

1

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

Как вы можете определить, является ли ноль "полезным"? или нет? harold
что вы имеете в виду с нулевыми индексами? marc wellman
Индекс не может быть нулевым в массиве. Ни значение, потому чтоbyte это тип значения Вы хотите удалить значения 0x00 из массива? Darin Dimitrov
@ Гарольд, потому что порядок очень важен для меня ... Soroush Khosravi
Когда ваш байт [] заполнен, вы должны где-нибудь получить значение, сообщающее, сколько байтов было прочитано (в настоящее время это, вероятно, возвращаемое значение изRead метод, который игнорируется). Вы должны использовать это, чтобы изменить размер массива, а не просто обрезать 0 до конца. Tim S.

Ваш Ответ

6   ответов
0

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

1

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

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

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();
Это остановится на первых 0 байтах и может потенциально обрезать ненулевые байты впоследствии. OP хочет удалить только последовательные нулевые байты в конце массива.
конечно, вы правы :) Но я не буду удалять пост, возможно, он даст ему представление о том, как использовать Список ..
0
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
Не могли бы вы отформатировать код и кратко объяснить его?
8

з массива.

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

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

    return array;
}
9

который читает из сокета 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 Khosravi
0

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

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

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

Похожие вопросы