Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Резюме для программиста

09.08.21 11:48
Re: Резюме для программиста
 
alex445 местный житель
в ответ AlexNek 09.08.21 10:49, Последний раз изменено 09.08.21 11:53 (alex445)
реверсировать порядок бит
И как делали?

Прошу прощения - не бит, а байт.


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


// ---- Учёт порядка байт (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;
}

 

Перейти на