C # удаляет нули из конца байта [512] - PullRequest
2 голосов
/ 27 февраля 2011

Каков наилучший способ удалить лишние значения 00-00-00-00-00 из моего байта [512]?

В настоящее время, когда я загружаю его с некоторыми данными из полученного пакета, который не является 512байт возвращает что-то вроде

    Byte[] received = new Byte[512];
    int Recieving = Sockitty.ReceiveFrom(received, ref endPoint132);
    string dataReceived = BitConverter.ToString(received);
    txtReceived.AppendText(dataReceived);
    //Outputs the following
    74 68 69 73 20 69 73 20 61 
    20 74 65 73 74 00 68 65 6c 
    6c 6f 20 00 68 65 72 65 2e
    **00** 00 00 00 00 00 00 00 00 //This is the part that needs to be removed but the stared 00.
    00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 ... and so on

Как я могу удалить только последние 00?как вы можете видеть, внутри самого пакета есть 00, которые я не хочу удалять.

Будет ли лучший способ сделать это - повернуть вспять, а затем выполнить цикл, пока он не достигнет чего-то другого, кроме 00, а затемс тех пор загрузить его в новый байтовый массив?Откуда мне знать, в какой размер массива его загружать?

Я сбит с толку.Любая помощь приветствуется.Спасибо!

Ответы [ 5 ]

7 голосов
/ 27 февраля 2011

Эта перегрузка Socket.ReceiveFrom возвращает количество байтов, считанных в массив; уважайте содержимое массива до этой длины или, если вам действительно нужно, измените размер массива до этой длины.

3 голосов
/ 27 февраля 2011

Вы можете сделать это просто с помощью linq:

received = received.Reverse().SkipWhile(x => x == 0).Reverse().ToArray();

Поскольку ваш размер ввода невелик, проблем с производительностью нет, за исключением того, что вы слишком часто обращаетесь к нему за короткое время (в этом случае вы можете выполнить итерациюМассив нормально).но я думаю, что ваш прием занимает больше времени, чем эта часть кода.

Редактировать: Для вашего комментария дела:

received = received.Reverse()
          .SkipWhile((x,i) => x == 0 && received[512 - i - 2] == 0).Reverse().ToArray();
3 голосов
/ 27 февраля 2011

Вы можете найти первое ненулевое значение с конца, а затем скопировать эти данные в новый массив:

int len = 512;
while (len > 0 && received[len - 1] == 0) {
  len--;
}
{
byte[] cropped = new byte[len];
if (len > 0) {
  Array.Copy(received, 0, cropped, 0, len);
}
received = cropped;

Если возможно, вы должны попытаться выяснить, каков фактический размерданные вместо того, чтобы искать ненулевые значения.Возможно, что данные будут содержать нулевые значения в конце, которые не должны быть удалены.

Edit:

Метод ReceiveFrom возвращает количество байтов, которые вы получили в буфере,Вы должны использовать это:

byte[] received = new Byte[512];
int len = Sockitty.ReceiveFrom(received, ref endPoint132);
byte[] cropped = new byte[len];
Array.Copy(received, 0, cropped, 0, len);
received = cropped;
0 голосов
/ 27 февраля 2011
byte[] getclear()
{
    int length = 512;
    int first_nonzero_reversed = 0;
    byte[] received = new byte[length];
    //get data
    for (int i = length - 1; i >= 0; i--)
    {
        if (received[i] != 0)
        {
            first_nonzero_reversed = i;
            break;
        }
    }
    byte[] target = new byte[first_nonzero_reversed + 1];
    Array.Copy(received, target, target.Length);
    return target;
}
0 голосов
/ 27 февраля 2011
byte[] buf;

...

int length;
for(length = buf.length -1; i--; (i>=0) && buf[length] == 0)
    continue;

byte[] cleanData = new byte[++length];
Array.Copy(buf, 0, cleanData, 0, length);
...