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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразование и адрес 
:(
    Опции темы
zss
Дата 1.5.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1.есть структура. нужно ее преобразовать в массив байт

Код

unsafe{
    fixed (byte* buffer = my_struct){
      ...
    }
}


не получается. Как вообще в C# берется адрес?

2. Нужно также сделать обратно из массива байт в структуру
3. Если ли в C# union?

4. Где бы хорошую книжечку скачать нахаляву smile 
PM MAIL ICQ   Вверх
zss
Дата 1.5.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



P.S. И еще - есть структура

Код

struct S{
   public int a;
   public int b;

   public S (int v1, int v2){
      a = v1; b = v2;
   }

}


тоесть у нее есть конструктор, но не получается создать
Код

main(){
   S s (1, 2);
}
 
PM MAIL ICQ   Вверх
Void
Дата 1.5.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



1, 2. Используй сериализацию.

Цитата(zss @  1.5.2006,  21:20 Найти цитируемый пост)
3. Если ли в C# union?

Смотри System.Runtime.InteropServices.StructLayoutAttribute

Цитата(zss @  1.5.2006,  21:36 Найти цитируемый пост)
тоесть у нее есть конструктор, но не получается создать

Синтаксис создания структур и классов в C# такой:
Код
S s = new S(1, 2);
 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
zss
Дата 1.5.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Void @  1.5.2006,  19:50 Найти цитируемый пост)
1, 2. Используй сериализацию

нашел в хелпе пример с BinaryFormatter

но в хелпе его namespace
System.Runtime.Serialization.Formatters.Binary

у меня такого пространства нет smile


Цитата(Void @  1.5.2006,  19:50 Найти цитируемый пост)
Смотри System.Runtime.InteropServices.StructLayoutAttribute

не совсем понял чем он может помочь 
PM MAIL ICQ   Вверх
Void
Дата 1.5.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(zss @  1.5.2006,  22:41 Найти цитируемый пост)
не совсем понял чем он может помочь 

Например:
Код
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct A
{
    [FieldOffset(0)]
    short low;
    [FieldOffset(2)]
    short high;
    [FieldOffset(0)]
    int dword;
}

эквивалентно
Код
union A {
    struct {
        short low, high;
    };
    int dword;
};


Цитата(zss @  1.5.2006,  22:41 Найти цитируемый пост)
но в хелпе его namespace
System.Runtime.Serialization.Formatters.Binary

у меня такого пространства нет

Быть не может smile Какой фреймворк?  

Это сообщение отредактировал(а) Void - 1.5.2006, 20:51


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
zss
Дата 1.5.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



фреймворк 2.0


сериализация вроде получилась через Marshal

остался такой вопрос. Я читаю буфер данных. Он может быть переменной длинны.

Единственное что у него фиксированно - заголовок. Как в C# можно накладывать
структуры на определенные адреса ?

Я так понимаю сериализация здесь не поможет


Цитата(Void @  1.5.2006,  20:50 Найти цитируемый пост)
[StructLayout(LayoutKind.Explicit)]

по Explicit что имеется ввиду ? 
PM MAIL ICQ   Вверх
ivashkanet
Дата 1.5.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(zss @  1.5.2006,  19:36 Найти цитируемый пост)
main(){    
   S s (1, 2);    
}

Даа... Тебе точна книжка нужна. Любая.  
Посмотри здесь есть курс по С#. А еще есть книга Тролелсена, набири в поиске smile 
Цитата(zss @  1.5.2006,  19:20 Найти цитируемый пост)
unsafe{

Такое в С# не приветствуется. 
Что хоть за структура? Покажи. Все преобразования, обычно, идут по осмысленные, исходя из вида структуры smile 
Цитата(zss @  1.5.2006,  19:36 Найти цитируемый пост)
тоесть у нее есть конструктор, но не получается создать

Код

S s = new S(1,2); ;-) 
 
PM MAIL WWW ICQ   Вверх
zss
Дата 1.5.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и что-то таким макаром не получается
Код

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct A
{
    public int a1;
    public int a2;
    public int a3;

    [FieldOffset(0)]
    public short low;
    [FieldOffset(2)]
    public short high;
    [FieldOffset(0)]
    public int dword;

    A(...){
       ...
    }
}
 

тоесть эквивалент
Код


    struct {
        int a1, a2, a3;
        union {
            short low, high, dword;
        }
    };
};
 


Цитата

Даа... Тебе точна книжка нужна. Любая


3 день на C# smile

[/quote]
[/quote] 

Это сообщение отредактировал(а) zss - 1.5.2006, 21:21
PM MAIL ICQ   Вверх
Void
Дата 1.5.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(zss @  1.5.2006,  23:13 Найти цитируемый пост)
по Explicit что имеется ввиду ?  

Смещение каждого поля задается явно.
Цитата(zss @  1.5.2006,  23:13 Найти цитируемый пост)
фреймворк 2.0

Странно. Есть там пространство имен System.Runtime.Serialization.Formatters.Binary. И references никакие дополнительные не нужны для него.

Добавлено @ 21:18 
Цитата(zss @  1.5.2006,  23:17 Найти цитируемый пост)
и что-то таким макаром не получается

Приведи C++ный аналог, я переведу. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
ivashkanet
Дата 1.5.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Чуть опоздал...
Цитата(zss @  1.5.2006,  21:13 Найти цитируемый пост)
Как в C# можно накладывать
структуры на определенные адреса ?

Имея скелет (имя) структуры и применяя преобразование
Код

car = (Car) Object;

Здесь Car -- структура, Object -- по сути ссылка на объект в памяти, по сути -- адрес.

P.S. И вообще, забудь про адреса, это тебе не С/C++. 
Здесь вся работа идет с именами переменных, которые, в принципе, ссылки на структуры и классы. 
PM MAIL WWW ICQ   Вверх
Void
Дата 1.5.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(zss @  1.5.2006,  23:17 Найти цитируемый пост)
 struct {
        int a1, a2, a3;
        union {
            short low, high, dword;
        }
    };

Ты уверен, что именно так? Слегка бессмысленно.

Добавлено @ 21:30 
ivashkanet, увы, думаю, твой совет не очень уместен. Я так понял, тут идет интероп с каким-то протоколом или форматом. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
zss
Дата 1.5.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Void @  1.5.2006,  21:18 Найти цитируемый пост)
Приведи C++ный аналог, я переведу

С++ аналог извращенный

проблемма в том, что поля определеняются через заголовок
а после заголовка могут быть различные структуры данных


это только заголовок
Код

/* -------------------------------------------------------------------------- */
/* INTERFACE.H                                                                */
/* -------------------------------------------------------------------------- */
#ifndef _INTERFACE_H_
#define _INTERFACE_H_
/* -------------------------------------------------------------------------- */
#include <typedef.h>
/* -------------------------------------------------------------------------- */
enum WF_TYPE {
    WF_CONTROL,
    WF_MANAGER,
    WF_DATA
};
/* -------------------------------------------------------------------------- */
enum WF_SUBTYPE {
    WF_REQUEST,        
    WF_ANSWER        
};
/* -------------------------------------------------------------------------- */
enum WF_COMMAND {
    WF_DEVICE_CONFIG,
    WF_READ_DATA,
    WF_SET_CHANNEL,
    WF_START_DEVICE,
    WF_STOP_DEVICE,
    WF_START_ANALYSE,
    WF_STOP_ANALYSE,
    WF_UPDATE_FILTER
};
/* -------------------------------------------------------------------------- */
enum WF_RESULT {
    WF_ERROR    = 0x00000000,
    WF_SUCCESS    = 0x00000001
};
/* -------------------------------------------------------------------------- */
#pragma pack(push, 1)
/* -------------------------------------------------------------------------- */
typedef struct _SCAN_HEADER {
    unsigned chCount;
    unsigned timeOut;

    void SetParam (unsigned count, unsigned time){
        chCount = count;
        timeOut = time;
    }

}SCAN_HEADER, *PSCAN_HEADER;
#define SCAN_HEADER_ sizeof(SCAN_HEADER)
/* -------------------------------------------------------------------------- */

typedef struct _WF_HEADER {

    WF_TYPE        type;
    WF_SUBTYPE    subtype;
    WF_COMMAND    command;
    union {
        unsigned        value;
        WF_RESULT        result;
        SCAN_HEADER        scanHeader;
    };

    _WF_HEADER () : type ((WF_TYPE)0),
                    subtype ((WF_SUBTYPE)0), command ((WF_COMMAND)0),
                    value (0) {;}

    _WF_HEADER (WF_TYPE wfType, WF_SUBTYPE wfSubtype,
                WF_COMMAND wfCommand) :
                type (wfType), subtype (wfSubtype), command (wfCommand),
                value (0) {;}

    void SetControl (WF_TYPE wfType, WF_SUBTYPE wfSubtype,
                     WF_COMMAND wfCommand) {
        type = wfType;
        subtype = wfSubtype;
        command = wfCommand;
    }

}WF_HEADER, *PWF_HEADER;
#define WF_HEADER_ sizeof(WF_HEADER)

/* -------------------------------------------------------------------------- */
#pragma pack(pop)
/* -------------------------------------------------------------------------- */
inline bool IsManager (const WF_HEADER& header){
    return (header.type == WF_MANAGER);
}
inline bool IsControl (const WF_HEADER& header){
    return (header.type == WF_CONTROL);
}
inline bool IsData (const WF_HEADER& header){
    return (header.type == WF_DATA);
}
inline bool IsRequest (const WF_HEADER& header){
    return (header.subtype == WF_REQUEST);
}
inline bool IsAnswer (const WF_HEADER& header){
    return (header.subtype == WF_ANSWER);
}
/* -------------------------------------------------------------------------- */
#endif
/* -------------------------------------------------------------------------- */


Добавлено @ 21:33 
а прочитав его нужно еще бегать по различным типам структур 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.5.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Там где встречается union, нужно забивать на наложение и использовать в struct-е переменную самой большой длины, какая есть внутри union-а. В C# нет аналога union-у, имхо. 


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


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



zss, прошу прощения, я почему-то пропустил твой ответ. Это будет выглядеть примерно так:
Код
[StructLayout(LayoutKind.Explicit)]
struct WF_HEADER
{
    public enum Type
    {
        Control,
        Manager,
        Data
    }
    public enum SubType
    {
        Request,
        Answer
    }
    public enum Command
    {
        DeviceConfig,
        ReadData,
        SetChannel,
        StartDevice,
        StopDevice,
        StartAnalyse,
        StopAnalyse,
        UpdateFilter
    }
    public enum Result
    {
        Success,
        Error
    }

    public struct ScanHeader
    {
        public uint chCount, timeout;

        public ScanHeader(uint count, uint time)
        {
            chCount = count;
            timeout = time;
        }
    }

    [FieldOffset(0)]
    public Type type;

    [FieldOffset(4)]
    public SubType subtype;

    [FieldOffset(8)]
    public Command command;

    [FieldOffset(12)]
    public uint value;
    [FieldOffset(12)]
    public Result result;
    [FieldOffset(12)]
    public ScanHeader scanHeader;

    public WF_HEADER(Type type, SubType subtype, Command command)
    {
        this.type = type;
        this.subtype = subtype;
        this.command = command;
        // the following two assignments required by C# constructor semantics
        result = 0;
        scanHeader = new ScanHeader();
        value = 0;
    }

    private void SetControl(Type type, SubType subtype, Command command)
    {
        this.type = type;
        this.subtype = subtype;
        this.command = command;
    }

    bool IsManager()
    {
        return type == Type.Manager;
    }

    /* and so on */
}



mr.DUDA, StructLayoutAttribute и обеспечивает реализацию union, без него куча интеропа не работала бы. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
zss
Дата 6.5.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivashkanet @  1.5.2006,  21:22 Найти цитируемый пост)
P.S. И вообще, забудь про адреса, это тебе не С/C++. 
Здесь вся работа идет с именами переменных, которые, в принципе, ссылки на структуры и классы.  


блин - как все сложно то...

есть функция, которая хочет
f (byte[] buffer)

у меня есть
ushort[] array

хочу ей его подсунуть, но никак титы не приведу

(byte *)&array[0] - не нравится

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

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


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

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


 




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


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

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