Резюме для программиста
реверсировать порядок битИ как делали?
Прошу прощения - не бит, а байт.
Написал класс и инструкцию к нему. Вообще, эта проблема выскочила неожиданно - когда попытались общаться моим клиентским приложением с платой. Никто из нас о разных порядках записей байт в разных архитектурах не знал.
// ---- Учёт порядка байт (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;
}