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


Автор: Vyacheslav 16.3.2005, 10:55
Кто поскажет, как эффективно сделать следущее. По сокету мне приходит массив байтов
Byte []. Как, например преобразовать первый два байта в UInt16, следушие 4 байта в UInt32.
Элементарные вещи, в managed C++ это для меня проблема.

Автор: [Last]Wizard 16.3.2005, 11:18
Первое, что приходит на ум:
Код
// arr - массив байтов
UInt16 num1 = arr[0]<<8 + arr[1];
UInt32 num2 = arr[2]<<24 + arr[3]<<16 + arr[4]<<8 + arr[5];

Автор: Vyacheslav 16.3.2005, 11:22
Спасибо. Но мне, к сожалению, пришло тоже нечто подобное smile Уж очень неуклюже выгдядит.

Автор: Domestic Cat 16.3.2005, 11:26
А методы ToUInt16, ToUInt32 класса BitConverter?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystembitconvertermemberstopic.asp

Автор: Vyacheslav 16.3.2005, 13:36
Похоже то, что надо.

А то я уже с помощью template решил вопрос
Код

template <typename T>
void GetValue(T& Value, Byte Buffer __gc[], int Offset)
{
    for (int i = Offset + sizeof(T); i > Offset; --i) {
        Value <<= BYTE_SIZE;
        Value += Buffer[i - 1];            
    }
}


template<typename T >
void SetValue(T Value, Byte Buffer __gc[], int Offset)
{
    for(int i = Offset; i < Offset + sizeof(T); i++) {
        Buffer[i] = Value;
        Value >>= BYTE_SIZE;
    }
}


Автор: Vyacheslav 16.3.2005, 19:15
А еще вопрос. Можно ли структуру перевести в массив байтов и обратно

Автор: Domestic Cat 17.3.2005, 08:16
Цитата(Vyacheslav @ 16.3.2005, 10:15)
А еще вопрос. Можно ли структуру перевести в массив байтов и обратно


Если тебе нужно писать структуру в стрим, то проще ее сериализовать, что-то типа
Код

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
    [Serializable]
    struct Person
    {
         public String name;
         public String phone;
         public Person(String name, String phone)
       {
           this.name = name;
           this.phone = phone;
       }
    }

    class Class1
    {    
       static void Main(string[] args)
        {
           Person p = new Person("John Doe", "290-3487");
           BinaryFormatter bf = new BinaryFormatter();
           FileStream fs = File.Create("Person.ser");
           bf.Serialize(fs, p);
           fs.Close();
       }
    }
}

- это в файл.

Автор: Vyacheslav 17.3.2005, 10:52
Про сериализацию понятно. Вопрос в том, что мне приходит уже готовый набор данных, который создан посредством тупого копирования куска памяти, где лежит структура, в массив. Можно ли организовать сериализацию таким образом, что было возможность из этого массива восстановить структуру и при необходимости в таком же виде сохранить?

Автор: Domestic Cat 17.3.2005, 11:12
Можно сериализовать объект как хочешь, для этого он должен наследовать от ISerializable
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclasstopic.asp

Автор: Vyacheslav 18.3.2005, 11:16
Нашел приемлимое решение
Код

Byte temp[];
...
MY_STRUCT data;

 { // ограничиваем время жизни __pin указателя
    void __pin* fixed  = &temp[0];
    data  = *reinterpret_cast< MY_STRUCT* >(fixed);
 }


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