Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Преобразование типов в С#


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

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

Спасибо.

Автор: farad 18.1.2008, 12:21
попробуй так:
Код

            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);
            }


Автор: jorikdima 18.1.2008, 12:35
спасибо. работает. Но для меня как человека пишушего на С это выглядит просто ДИКО!!! smile smile smile

Автор: 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

Автор: jorikdima 20.1.2008, 20:28
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)