- Не кладите здесь пустой универсальный блок
catch
, просто молча поймайте и продолжайте. Вы должны проверить и убедиться, что вы получаете реальное исключение и идти оттуда.
- Нет необходимости в функции
byteToHexString
. Просто используйте префикс 0x
перед шестнадцатеричным числом, и он сделает двоичное сравнение.
1010 * т.е. *
if(al[0] == 0x16 && al[1] == 0x3C && al[2] == 0x02)
{
...
}
- Я не знаю, что делает ваша функция
doConvert
(вы не указали этот источник), но класс BinaryReader
предоставляет множество различных функций, одна из которых ReadInt16
. Если ваши short
не хранятся в закодированном формате, это должно быть проще в использовании, чем ваше довольно запутанное и запутанное преобразование. Даже если они закодированы, все равно будет гораздо проще читать byte
s и манипулировать ими, чем выполнять несколько циклических переходов с преобразованием в строки.
Редактировать
Похоже, вы очень очень либерально используете методы расширения LINQ (особенно ElementAt
). Каждый раз, когда вы вызываете эту функцию, она перечисляет ваш список, пока не достигнет этого числа. У вас будет намного более эффективный код (а также меньше подробностей), если вы просто используете встроенный индексатор в списке.
т.е. al[3]
, а не al.ElementAt(3)
.
Кроме того, вам не нужно вызывать Flush
на входе Stream
. Flush
используется, чтобы указать потоку записывать все, что у него есть в буфере записи, в дескриптор файла ОС. Для входного потока это ничего не сделает.
Я бы предложил заменить ваш текущий sw.WriteLine
вызов следующим:
sw.WriteLine(BitConverter.ToString(packet));
и посмотрите, являются ли данные, которые вы ожидаете в строке, где они начинают портиться, на самом деле тем, что вы получаете.
Я бы на самом деле сделал это:
if (packet.Take(3).SequenceEqual(STARTCODE) &&
packet.Skip(packet.Length - ENDCODE.Length).SequenceEqual(ENDCODE))
{
ushort id = BitConverter.ToUInt16(packet, 3);
ushort semistable = BitConverter.ToUInt16(packet, 5);
byte contant = packet[7];
for(int i = 8; i < 72; i += 2)
{
il.Add(BitConverter.ToUInt16(packet, i));
}
foreach(ushort element in il)
{
sw.WriteLine(string.Format("{0},{1},{2},{3}", id, semistable, constant, element);
}
il.Clear();
}
else
{
//handle "bad" packets
}