Сообщение Re: Начинаю учить C# :( от 27.07.2016 11:04
Изменено 27.07.2016 11:05 LWhisper
Здравствуйте, 777777w, Вы писали:
7>Но главная проблема дальше. Данные принимаются в массив байт. В Си я создавал указатель типа CDataPacket, указывал им на начало массива и работал с ним. Здесь указателей нет, данные ссылочного типа создаются сразу со "своими" данными, а как быть если данные уже существуют отдельно? Ведь ситуация очень распространенная, двоичные файлы тоже читаются в массив байт, как их интерпретировать как структуры неких дынных? Дальше при обработке этой структуры тоже придется преобразовывать типы — поле Data в зависимости от типа устройства и типа информации интерпретируется как другие структуры, как здесь быть?
Закрепляешь управляемый массив в памяти, берёшь указатель на него (предварительно проверив, что он больше 0), приводишь его к нужному тебе типу и работаешь с ним точно также, как в С++.
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), приводишь его к нужному тебе типу и работаешь с ним точно также, как в С++.
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);
}
}