Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразование типов, применительно к массивам 
:(
    Опции темы
jorikdima
Дата 6.10.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Приветствую.
У меня из com порта сыпятся набор байт, которые являются на самом деле сообщениями в определенном формате. Посылки, предположим по 64 байта, которые я принимаю и упаковывая в массив byte[64]. Этот массив передаю функции, которая парсит. Но внутри массива фактически лежат разные переменные разной длинны. Например может сначала лежать int32? а после него структура, ну предположим:
Код

struct STR
{
UINT32 el1;
UINT32 el2
UINT64 el3;
}


а еще лучше массив таких структур, а в еще более общем случае массив произвольных объектов.
Как мне работать с этими объектами. В С я бы просто либо создал типизированный указатель на такой объект и сделал бы неявное преобразование типа:
Код

STR* p = &arr[0];  // где arr это тот самый массив из 64 элементов.

А затем делая инкремент указателя обращался бы к каждому элементу массива моих объектов или структур.
А тут в C# как? Как мне "посмотреть" на массив из 64 байт, как, например, на массив из 16 4 байтных int'ов или на массив из 4 структур типа STR?
Спасибо.
PM MAIL   Вверх
MasterOfCode
Дата 7.10.2008, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



Как ты узнаешь что сейчас 64 байта представляют именно данную структуру?


--------------------
user posted image
PM ICQ   Вверх
jorikdima
Дата 7.10.2008, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Цитата(MasterOfCode @ 7.10.2008,  06:17)
Как ты узнаешь что сейчас 64 байта представляют именно данную структуру?

в том то и дело, что я это знаю smile В принимаемом сообщении есть message_id, которое и определяет структуру всего сообщения. Набор message_id конечен и известен на этапе компиляции.
PM MAIL   Вверх
MasterOfCode
Дата 7.10.2008, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



Ну раз знаешь какая структура, то распарсивай массив, потом уже эти данные преобразовывай. BitConverter тебе поможет. smile


--------------------
user posted image
PM ICQ   Вверх
jorikdima
Дата 7.10.2008, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Цитата(MasterOfCode @ 7.10.2008,  07:21)
Ну раз знаешь какая структура, то распарсивай массив, потом уже эти данные преобразовывай. BitConverter тебе поможет. smile

Если не сложно покажи плиз, как массив byte[64] преобразовать к типу STR[8], где STR это произвольная структура (тип описан естественно), размером 8 байт.
PM MAIL   Вверх
MasterOfCode
Дата 7.10.2008, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



Пишу "от руки":
Код

...
//bt - это твой массив с размером 64
...
byte[] bString = new byte[8];
List<string> lst = new List<string>();
int j = 0;
for (int i = 0; i < bt.Length; i++)
{
    bString[j] = bt[i];
    if ((i+1) % 8) == 0)
    {
        lst.Add(BitConverter.ToString(bString));
        j = -1;
    }
    j++;
}
foreach(string str in lst)
{
    Console.WriteLine(str);
}
Console.Read();


Добавлено через 3 минуты и 41 секунду
Может конечно можно и красивее сделать smile Если кто покажет, я буду рад smile


--------------------
user posted image
PM ICQ   Вверх
jorikdima
Дата 7.10.2008, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Не-не-не  smile В строку мне не надо. Под структурой STR я подразумевал, например, описанную выше структуру
Код

struct STR
{
UINT32 el1;
UINT32 el2
UINT64 el3;
}

, а вообще говоря любую структуру, состоящую из value-type (ну или как там они называются, в общем int , short и пр) полей.
В строку то я знаю как smile
PM MAIL   Вверх
MasterOfCode
Дата 7.10.2008, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



У BitConverter есть такие методы как:
Код

BitConverter.ToUInt32(byte[]  value, int startIndex);
BitConverter.ToUInt64(byte[]  value, int startIndex);


Подставляй их. smile

Добавлено через 1 минуту и 51 секунду
да, если структуру нужно заполнить то вместо List<string> lst; подставь свою структуру.


--------------------
user posted image
PM ICQ   Вверх
jorikdima
Дата 7.10.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Пожалуй я понял в чем моя проблема... Я привык что в С статические массивы занимают место в памяти последовательно, поэтому можно делать неявное преобразование типов к чему угодно. Тут же byte[64] это динамический массив и "взглянуть" на негопо другому никак нельзя, к сожалению. То есть конвертици неминуемо связана с вызовом некоторой функции преобразования. 

Будем думать. Спасибо, MasterOfCode.
PM MAIL   Вверх
PashaPash
Дата 7.10.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



jorikdima, посмотри еще в сторону Marshal.PtrToStructure и Marshal.Copy.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.