Лучший метод для анализа байтового массива только с необходимыми символами c# - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь прочитать сообщение из последовательного порта. Я читаю это как байты данных. У меня есть байтовый массив, который содержит все байты данных, которые я прочитал из последовательного порта. Мой байтовый массив содержит строку сообщения, подобную этой, после преобразования в строку.

\ u0006 \ u0001 \ 0d \ o? \ "\ 0 $? ## STA \ r \ nSystemLevel: Run \ r \ nstatus: 1 \ r \ nСенсор Значение: 12.45 \ r \ n ................ \ r \ nSTOP ##

Я ищу определенный байт шаблон (например, начальный байт) из байтового массива, если он совпадает с преобразованием всего в строку символов из этой точки индекса до определенной длины индекса, поскольку я знаю длину сообщения, которое я хочу преобразовать. Например, byte [25] to byte [185 ].

Я просто хочу узнать, какой способ считывания результатов лучше всего из строки сообщения: значения результата, например, байт [28], байт [32], байт [42], байт [49]. ] ... et c.

Лучше ли преобразовывать все требуемые байты в строку и анализировать их? Или лучше использовать несколько байтовых шаблонов для получения символов. Это лучший метод.

Ответы [ 3 ]

0 голосов
/ 08 января 2020

Вы всегда можете сделать что-то для l oop, например:

using System;
using System.Text;

namespace _ {
  class Q {
    public static void Main(string[] args) {
      string str = @"\u0006\u0001\0d\o?\""\0$?##STA\r\nSystemLevel:Run\r\nstatus:1\r\nSensor Value:12.45\r\n................\r\nSTOP##";
      byte[] bts = Encoding.UTF8.GetBytes(str);
      var g23to40 = getRange(bts, 22, 39);
      Console.WriteLine(Encoding.UTF8.GetString(g23to40));
    }
    public static byte[] getRange(byte[] a, int s, int e = -1) {
      if (e == -1) { e = a.Length-1; }
      if (e <= s) { return new byte[]{}; }
      byte[] r = new byte[e-s];
      int bi = 0;
      for (int i = s; i != e; i++) {
        if (i >= s && i <= e) {
          r[bi] = a[i];
          bi++;
        }
      }
      return r;
    }
  }
}
0 голосов
/ 08 января 2020

по моему мнению:

  1. я бы обработал его как массив байтов и удалил заголовок / контрольную сумму / ...

byte.Skip(..).Take(...)

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

, если вы ищете вещи в массиве байтов: я полагаю, вы не слишком много работаете данные (100Mb +). Потому что Линк не самый быстрый.

Byte<Span>

- самый быстрый (. net Core)

, и здесь находится самый быстрый:

поиск байтов [] в массиве

(вещь Buffer.BlockCopy)

0 голосов
/ 08 января 2020

Вот пример моего кода, который я использовал в проекте, где receiveMessage это byte[]:

year = receiveMessage[4];
month = receiveMessage[5];
day = receiveMessage[6];
hour = receiveMessage[7];
minute = receiveMessage[8];
second = receiveMessage[9];
date = new DateTime(2000 + year, month, day, hour, minute, second);

WriteDBMessageLocation locationMessage = new WriteDBMessageLocation();
locationMessage.message = DATABASE_MESSAGE_TYPE.LOCATION;

locationMessage.trackTime = date;
locationMessage.currTime = DateTime.Now;

locationMessage.lattitude = new byte[4];
Array.Copy(receiveMessage, 11, locationMessage.lattitude, 0, 4);

locationMessage.longitude = new byte[4];
Array.Copy(receiveMessage, 15, locationMessage.longitude, 0, 4);
locationMessage.speed = receiveMessage[19];

locationMessage.courseStatus = new byte[2];
Array.Copy(receiveMessage, 20, locationMessage.courseStatus, 0, 2);

locationMessage.IMEI = byteState.Value.IMEI;
WriteDBAsync.ReadWriteFifo(WriteDBAsync.Mode.WRITE, locationMessage);```


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...