Перестановка и отклонение массива

У меня есть массив, который передается мне, когда я получаю хорошие данные, это выглядит так:

byte[] buffer = { 0xaa, 0x02, 0x47, 0xf0, 0x79, 0x00, 0x45, 0x2c, 0x12, 0x20, 0xc6, 0x00, 0xa1, 0x2d, 0xb2, 0x55 };

Однако я хотел бы перестроить массив на случай, если он не появится правильно. например:

byte[] buffer = { 0x02, 0x47, 0xf0, 0x79, 0x00, 0x45, 0x2c, 0x12, 0x20, 0xc6, 0x00, 0xa1, 0x2d, 0xb2, 0x55, 0xaa };

Сообщение должно начинаться с 0xaa и заканчиваться 0x55. в этом случае это 0xaa в конце.

Бонус: как я могу отклонить сообщение, если сказать, что специальный или нежелательный персонаж был случайно передан?

Я попытался использовать

array.copy(buffer, index, new_buffer, buffer.length-index);

также, но это не сработало. Это то, что у меня есть до сих пор:

byte[] adjusted_buffer = new byte[16]; //byte[] buffer = { 0xaa, 0x02, 0x47, 0xf0, 0x79, 0x00, 0x45, 0x2c, 0x12, 0x20, 0xc6, 0x00, 0xa1, 0x2d, 0xb2, 0x55 }; byte[] buffer = { 0x02, 0x47, 0xf0, 0x79, 0x00, 0x45, 0x2c, 0x12, 0x20, 0xc6, 0x00, 0xa1, 0x2d, 0xb2, 0x55, 0xaa }; if (buffer[0].Equals(0xaa) && buffer[15].Equals(0x55) && buffer.Length.Equals(16)) { Console.WriteLine("arranged"); } else { int index = Array.IndexOf<byte>(buffer, 0xaa); if (buffer[index - 1].Equals(0x55) && buffer.Length.Equals(16)) { for (int i = 0; i < buffer.Length; i++) { adjusted_buffer[i] = buffer[index + i]; } Console.WriteLine(adjusted_buffer); } else { index = (byte) Array.IndexOf(buffer, 0xaa, index); if (buffer[index - 1].Equals(0x55) && buffer.Length.Equals(16)) { for (int i = 0; i < buffer.Length; i++) { adjusted_buffer[i] = buffer[index + i]; } Console.WriteLine("rearranged again");
</byte>
1 ответ

Позвольте начать с объявления некоторых констант...

const byte START = 0x02;
const byte END = 0x55;
const int SIZE = 16;

Затем мы можем обрабатывать входящие сообщения...

var buffer = /* set incoming buffer value */;
if (buffer[0] != START)
{ var fixedBuffer = new List<byte> { START }; fixedBuffer.AddRange(removeFirstInstanceFromBuffer(buffer, START)); buffer = fixedBuffer.ToArray();
}
if (buffer[buffer.Length - 1] != END)
{ var fixedBuffer = new List<byte>(); fixedBuffer.AddRange(removeFirstInstanceFromBuffer(buffer, END)); fixedBuffer.Add(END); buffer = fixedBuffer.ToArray();
}
// wherever you want to have helper methods
private byte[] removeFirstInstanceFromBuffer(byte[] bytes, byte b)
{ var idx = bytes.ToList().IndexOf(bytes.First(x => x == b)); var truncated = new List<byte>(); for (var i = 0; i < bytes.Length; i++) if (i != idx) truncated.Add(bytes[i]); return truncated.ToArray();
}
</byte></byte></byte>

Затем, если вы хотите выбросить ненужные символы и т.д., Просто объявите массив ненужных символов, которые вы хотите очистить, и используйте следующий метод утилиты ниже:

var bytesToRemove = new List<byte>();
foreach (var b in buffer)
{ if (JUNK_ARRAY.Contains(b)) bytesToRemove.Add(b);
}
foreach (var b in bytesToRemove)
{ buffer = removeFirstInstanceFromBuffer(buffer, b);
}
</byte>

ПРИМЕЧАНИЕ. Если поток байтов не проходит правильно, у вас могут быть большие проблемы, и просто перестановка может быть плохой идеей. Такие данные могут исходить от двигателя или датчика, поэтому, если он будет искажен, вы просто проигнорируете проблему. Код, приведенный выше, гарантирует, что ваше сообщение будет правильным байтом по байту и выдаст ошибку, если в потоке есть байт-мусор. И если вы теряете пакеты, у вас также возникает проблема с сетью, а не только программная.

EDIT: неверный запрос, исправленный код для решения запрошенной проблемы, как объясняется @tweellt.

EDIT 2: Исправлен вспомогательный метод, чтобы найти индекс правильно.

licensed under cc by-sa 3.0 with attribution.