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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование типов в С#, short в byte[] 
V
    Опции темы
jorikdima
Дата 18.1.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Необходимо на С# написать простенькую программку. Но столкнулся с проблеммой, которую на С решил бы в одну строчку, а тут 
Есть класс
Код

public class MESSAGE
{ 
public static byte[] prmbl = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
public UInt16 checkSum; 
public UInt16 length; 
public MESSAGE_ID msgID;   //MESSAGE_ID  это enum
public char[] data;
}


В этом классе, есть метод, с помощью которого надо создать новый массив byte[] в который последовательно скопировать все перечисленные поля, что бы потом передать в порт. И я не понял как мне объект типа Uint16 length преобразовать в тип byte[2] . То есть если length = 300; то в массиве первый элемент будет 0x1 а второй 0x2C. Как?
И второй вопрос. Есть ли в С# аналог #define или лучше typedef. Просто я бы хотел определить свой тип как в С 
typedef UINT16 LENGTH

Спасибо.

Это сообщение отредактировал(а) jorikdima - 20.1.2008, 20:29
PM MAIL   Вверх
farad
Дата 18.1.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



попробуй так:
Код

            MESSAGE msg = new MESSAGE();
            byte[] result;
            using(Stream str = new MemoryStream()/*любой другой поток, может стоит просто порт открыть*/)
            {
                BinaryWriter wr=new BinaryWriter(str);
                wr.Write(msg.checkSum);
                wr.Write(msg.length);
                wr.Write(msg.data);
                wr.Write(msg.msgID);
                wr.Flush();
                str.Seek(0, SeekOrigin.Begin);
                result = new byte[str.Length];
                str.Read(result, 0, str.Length);
            }


PM MAIL   Вверх
jorikdima
Дата 18.1.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо. работает. Но для меня как человека пишушего на С это выглядит просто ДИКО!!! smile smile smile
PM MAIL   Вверх
mr.DUDA
Дата 20.1.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Без мемори стрима можно:
Код
    public class MESSAGE
    { 
        public static byte[] prmbl = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
        public UInt16 checkSum; 
        public UInt16 length; 
        public MESSAGE_ID msgID;   //MESSAGE_ID  это enum
        public char[] data;

        public byte[] ToArray()
        {
            byte[] arr = new byte[5 + data.Length];
            int idx = 0;
            arr[idx++] = (byte)(checkSum >> 8);
            arr[idx++] = (byte)(checkSum & 0xff);
            arr[idx++] = (byte)(length >> 8);
            arr[idx++] = (byte)(length & 0xff);
            arr[idx++] = (byte)msgID;
            for (int i = 0; i < data.Length; i++)
                arr[idx++] = (byte)data[i];
            return arr;
        }
    }

Только учитываем что char в дотнете - это два байта, так что если буквы будут в юникоде то придётся писать 2 байта а не преобразовывать data[i] в чар.

Насчёт #define и typedef - таких в шарпе нету, но можно написать например такое:
Код
using LENGTH = System.UInt16;


Да, и кстати вместо UInt16 можно использовать ключевое слово ushort smile


--------------------
user posted image
PM MAIL WWW   Вверх
jorikdima
Дата 20.1.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mr.DUDA @ 20.1.2008,  17:51)
Без мемори стрима можно:
Код
    public class MESSAGE
    { 
        public static byte[] prmbl = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
        public UInt16 checkSum; 
        public UInt16 length; 
        public MESSAGE_ID msgID;   //MESSAGE_ID  это enum
        public char[] data;

        public byte[] ToArray()
        {
            byte[] arr = new byte[5 + data.Length];
            int idx = 0;
            arr[idx++] = (byte)(checkSum >> 8);
            arr[idx++] = (byte)(checkSum & 0xff);
            arr[idx++] = (byte)(length >> 8);
            arr[idx++] = (byte)(length & 0xff);
            arr[idx++] = (byte)msgID;
            for (int i = 0; i < data.Length; i++)
                arr[idx++] = (byte)data[i];
            return arr;
        }
    }

Только учитываем что char в дотнете - это два байта, так что если буквы будут в юникоде то придётся писать 2 байта а не преобразовывать data[i] в чар.

Насчёт #define и typedef - таких в шарпе нету, но можно написать например такое:
Код
using LENGTH = System.UInt16;


Да, и кстати вместо UInt16 можно использовать ключевое слово ushort smile

Огромное спасибо! Очень помогли.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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