Информация об изменениях

Сообщение Re: Начинаю учить C# :( от 27.07.2016 11:04

Изменено 27.07.2016 11:05 LWhisper

Здравствуйте, 777777w, Вы писали:

7>Но главная проблема дальше. Данные принимаются в массив байт. В Си я создавал указатель типа CDataPacket, указывал им на начало массива и работал с ним. Здесь указателей нет, данные ссылочного типа создаются сразу со "своими" данными, а как быть если данные уже существуют отдельно? Ведь ситуация очень распространенная, двоичные файлы тоже читаются в массив байт, как их интерпретировать как структуры неких дынных? Дальше при обработке этой структуры тоже придется преобразовывать типы — поле Data в зависимости от типа устройства и типа информации интерпретируется как другие структуры, как здесь быть?


Закрепляешь управляемый массив в памяти, берёшь указатель на него (предварительно проверив, что он больше 0), приводишь его к нужному тебе типу и работаешь с ним точно также, как в С++.

unsafe struct CDataPacket
{
    public char DevType; // тип устройства
    public byte InfType; // тип информации
    public byte Length; // длина
    public fixed byte Data [255]; // данные
};

unsafe static void ProcessPacket(byte[] packet)
{
    if(packet == null || packet.Length == 0)
        throw new ArgumentException("packet");

    fixed(byte* ptr = packet)
    {
        CDataPacket* sPtr = (CDataPacket*)ptr;
        String data = new String((sbyte*)sPtr->Data, 0, sPtr->Length);
        Console.WriteLine(data);
    }
}
Re: Начинаю учить C# :(
Здравствуйте, 777777w, Вы писали:

7>Но главная проблема дальше. Данные принимаются в массив байт. В Си я создавал указатель типа CDataPacket, указывал им на начало массива и работал с ним. Здесь указателей нет, данные ссылочного типа создаются сразу со "своими" данными, а как быть если данные уже существуют отдельно? Ведь ситуация очень распространенная, двоичные файлы тоже читаются в массив байт, как их интерпретировать как структуры неких дынных? Дальше при обработке этой структуры тоже придется преобразовывать типы — поле Data в зависимости от типа устройства и типа информации интерпретируется как другие структуры, как здесь быть?


Закрепляешь управляемый массив в памяти, берёшь указатель на него (предварительно проверив, что длина массива больше 0), приводишь его к нужному тебе типу и работаешь с ним точно также, как в С++.

unsafe struct CDataPacket
{
    public char DevType; // тип устройства
    public byte InfType; // тип информации
    public byte Length; // длина
    public fixed byte Data [255]; // данные
};

unsafe static void ProcessPacket(byte[] packet)
{
    if(packet == null || packet.Length == 0)
        throw new ArgumentException("packet");

    fixed(byte* ptr = packet)
    {
        CDataPacket* sPtr = (CDataPacket*)ptr;
        String data = new String((sbyte*)sPtr->Data, 0, sPtr->Length);
        Console.WriteLine(data);
    }
}