Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
У меня две системы с разными Endianess. Я посылаю данные по TCP.
Мне приходиться брать структуру, и переворачивать каждый член структуры.
А на другом конце по опкоду я знаю какая структура пришла и также переворачиваю каждый член структуры.
Вопрос можно как то генерик способом взять объект типа структура, проверить каждое поле сколько бит 32, 16
и так далее и в соответствии с этим перевернуть поле?
6 дек 17, 16:08    [21011654]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Изопропил
Member

Откуда:
Сообщений: 30649
Можно.
Рефлексией перебрать все поля и для каждого получись смещение от начала структуры

На stackoverflow масса примеров
7 дек 17, 08:53    [21013532]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
Изопропил
Можно.
Рефлексией перебрать все поля и для каждого получись смещение от начала структуры

На stackoverflow масса примеров

а как задать поиск в гугле? по каким словам?
7 дек 17, 09:46    [21013659]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Dima T
Member

Откуда:
Сообщений: 11465
https://metanit.com/sharp/tutorial/14.1.php
7 дек 17, 09:48    [21013674]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
Dima T
https://metanit.com/sharp/tutorial/14.1.php

спасибо.
7 дек 17, 10:19    [21013804]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
делаю так
 void BigToLitle(object obj)
 {
    Type mytype = obj.GetType(); 
     if (mytype.Equals(typeof(struct)))  
     {
     }     
}

ругается. структура не тип. а что делать? структура не поддается рефлексии.
7 дек 17, 10:50    [21013949]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4074
jenya7, IsValueType
7 дек 17, 11:09    [21014056]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4377
jenya7
ругается. структура не тип. а что делать?

Забить на программирование или учить матчасть.
7 дек 17, 11:48    [21014266]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
buser
jenya7, IsValueType

не работает. и ValueType тоже
7 дек 17, 11:54    [21014297]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4377
jenya7
не работает. и ValueType тоже

Печалька
7 дек 17, 12:08    [21014376]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 30365
jenya7
У меня две системы с разными Endianess. Я посылаю данные по TCP

Связать системы протоколом наследником. Т.е. выше уровнем.
7 дек 17, 12:08    [21014384]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
Petro123
jenya7
У меня две системы с разными Endianess. Я посылаю данные по TCP

Связать системы протоколом наследником. Т.е. выше уровнем.

Никакой протокол не перевернет ваши данные. вы сами должны разруливать эту ситуацию. если только протокол писанный руками.
гораздо проще взять данные и перевернуть их. у меня данные в структурах. я ищу генерик способ перебрать все члены структуры и перевернуть их в соответствии с типом.
7 дек 17, 12:36    [21014581]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 30365
jenya7,
Ты о чём?
В протоколе пересылается ключ=значение.
Не надо переворачивать).
7 дек 17, 15:02    [21015332]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Изопропил
Member

Откуда:
Сообщений: 30649
хочется двоичный протокол - переворачивайте байты сколько влезет
 public void enumFields(Type t)
        {
            foreach (var fi in t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                Type fieldType = fi.FieldType;
                IntPtr offset = Marshal.OffsetOf(t, fi.Name);                
                int fieldSize = Marshal.SizeOf(fieldType);
                if (!fieldType.IsNested)
                {
                    Console.WriteLine("field: {0} {1} {2}", fieldType.Name, offset, fieldSize);
                }
                else
                {
                    FixedBufferAttribute fa = (FixedBufferAttribute)fi.GetCustomAttribute(typeof(FixedBufferAttribute));
                    if (fa != null)
                    {
                        Type elementType = fa.ElementType;
                        var count = fa.Length;
                        fieldSize = Marshal.SizeOf(elementType);
                        Console.WriteLine("array: {0} {1} {2} {3}", elementType.Name, offset, fieldSize,count);
                    }
                }

            }
        }

unsafe struct A
    {

        Int32 a;
        Int16 b;
        UInt16 c;
        Int32 d;
        Int64 g;
        double h;
        SByte w;
        fixed Int16 rr[5];
        Single v;
        int er;
    }
7 дек 17, 15:12    [21015387]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Изопропил
Member

Откуда:
Сообщений: 30649
структура
[StructLayout(LayoutKind.Sequential)]
7 дек 17, 15:13    [21015391]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
Изопропил
хочется двоичный протокол - переворачивайте байты сколько влезет
 public void enumFields(Type t)
        {
            foreach (var fi in t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                Type fieldType = fi.FieldType;
                IntPtr offset = Marshal.OffsetOf(t, fi.Name);                
                int fieldSize = Marshal.SizeOf(fieldType);
                if (!fieldType.IsNested)
                {
                    Console.WriteLine("field: {0} {1} {2}", fieldType.Name, offset, fieldSize);
                }
                else
                {
                    FixedBufferAttribute fa = (FixedBufferAttribute)fi.GetCustomAttribute(typeof(FixedBufferAttribute));
                    if (fa != null)
                    {
                        Type elementType = fa.ElementType;
                        var count = fa.Length;
                        fieldSize = Marshal.SizeOf(elementType);
                        Console.WriteLine("array: {0} {1} {2} {3}", elementType.Name, offset, fieldSize,count);
                    }
                }

            }
        }

unsafe struct A
    {

        Int32 a;
        Int16 b;
        UInt16 c;
        Int32 d;
        Int64 g;
        double h;
        SByte w;
        fixed Int16 rr[5];
        Single v;
        int er;
    }

спасибо большое. попробую. у меня есть сложные структуры. структура в структуре да еще массив внутри.
7 дек 17, 16:17    [21015668]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
на строчке
FixedBufferAttribute fa = (FixedBufferAttribute)fi.GetCustomAttribute(typeof(FixedBufferAttribute));

получаю ошибку
автор
Severity Code Description Project File Line Suppression State
Error CS1061 'FieldInfo' does not contain a definition for 'GetCustomAttribute' and no extension method 'GetCustomAttribute' accepting a first argument of type 'FieldInfo' could be found (are you missing a using directive or an assembly reference?)
7 дек 17, 16:37    [21015758]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 30365
jenya7
сложные структуры. структура в структуре да еще массив внутри.

Как вариант сериализация объектов или json
7 дек 17, 16:46    [21015794]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
Petro123
jenya7
сложные структуры. структура в структуре да еще массив внутри.

Как вариант сериализация объектов или json

после сериализации я не знаю где какой член структуры. нет возможности перевернуть. мне нужно перевернуть - сделать сериализацию - отправить.
7 дек 17, 16:51    [21015818]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4377
jenya7
получаю ошибку
автор
Severity Code Description Project File Line Suppression State
Error CS1061 'FieldInfo' does not contain a definition for 'GetCustomAttribute' and no extension method 'GetCustomAttribute' accepting a first argument of type 'FieldInfo' could be found (are you missing a using directive or an assembly reference?)

using System.Reflection;
7 дек 17, 17:00    [21015857]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
ЕвгенийВ
jenya7
получаю ошибку
пропущено...

using System.Reflection;

включено. есть метод GetCustomAttributes но у него другие аргументы.
7 дек 17, 17:34    [21016002]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 30365
jenya7
после сериализации я

Сериализуют голые объекты. Без методов.
ООП.
Без неё - json
7 дек 17, 17:37    [21016021]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Изопропил
Member

Откуда:
Сообщений: 30649
ЕвгенийВ
jenya7
получаю ошибку
пропущено...

using System.Reflection;


using System.Runtime.CompilerServices;

Современная студия умеет показывать где искать
7 дек 17, 17:40    [21016037]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
jenya7
Member

Откуда:
Сообщений: 802
Изопропил
ЕвгенийВ
пропущено...

using System.Reflection;


using System.Runtime.CompilerServices;

Современная студия умеет показывать где искать

включил. но все равно не находит GetCustomAttribute.
7 дек 17, 18:30    [21016176]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация с Big Endian в Little Endian и обратно.  [new]
Изопропил
Member

Откуда:
Сообщений: 30649
jenya7
GetCustomAttribute.

это метод экземпляра System.Reflection.FieldInfo
7 дек 17, 19:00    [21016284]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить