Резюме для программиста
реверсировать порядок битИ как делали?
Прошу прощения - не бит, а байт.
Написал класс и инструкцию к нему. Вообще, эта проблема выскочила неожиданно - когда попытались общаться моим клиентским приложением с платой. Никто из нас о разных порядках записей байт в разных архитектурах не знал.
// ---- Учёт порядка байт (endianness), по которому хранятся данные в архитектурах
// Из-за реверсивного порядка байт в комьпютерной архитектуры плат LabVIEW (big-endian)
// по отношению к порядку байт в копьютерной архитектуре х86 (little-endian),
// последовательность байт для каждого значения (т. е. для каждой переменной, хранящей какое-то значение),
// полученного от аппаратного обеспечения LabVIEW, должна быть реверсирована.
// Это в случае, если программное обеспечение на стороне LabVIEW не делает такой реверс само
// (по умолчанию не делает, да мы и не договаривались делать реверс).
// Например, если получено два значения типа, аналогичному типу Int32 в .NET, нужно при переводе каждого этого значения в Int32
// (через, например, метод BitConverter.ToInt32) реверсировать порядок байт этого значения перед переводом.
// При этом строки реверсировать не нужно
// (по крайней мере, если эти строки представляют собой массивы однобайтовых значений - например, когда используется ASCII или UTF-8;
// если же это строки с двух- или более байтовыми значениями, то, НАВЕРНОЕ (т. е. надо выяснить!) надо тоже менять порядок байт).
// При отправке данных с х86 на LabVIEW байты всех значений надо также реверсировать для приведения их к порядку, с которым работает LabVIEW (big-endian).
// В этом классе и классах, которые относятся к парсингу данных с LabVIEW, предполагается, что они запущены на архитектуре с порядком байт little-endian,
// а принимают и отправляют данные на архитектуру с порядком байт big-endian.
// Т. е. эти классы не адаптируют свою работу под произвольные порядки байт и не проверяют свойство BitConverter.IsLittleEndian.
// -----------------------------------------------
Реверсировал банальным Reverse из LINQ по массиву байт. Например, для протокола стандарта SAE J1939
public static byte[] Serialize(SetMode_SAEJ1939 structToSerialize) { var modeBytes = BitConverter.GetBytes((uint)structToSerialize._mode) .Reverse(); byte[] payloadBytes = structToSerialize._payload; int payloadLength = payloadBytes.Length; var payloadLengthBytes = BitConverter.GetBytes(payloadLength) .Reverse(); var extendBytes = BitConverter.GetBytes(structToSerialize._extend) .Reverse(); var identifierBytes = BitConverter.GetBytes(structToSerialize._identifier) .Reverse(); byte[] resultBytes = modeBytes .Concat(payloadLengthBytes) .Concat(payloadBytes) .Concat(extendBytes) .Concat(identifierBytes) .ToArray(); return resultBytes; }