Конвертация с Big Endian в Little Endian и обратно.

jenya7

У меня две системы с разными Endianess. Я посылаю данные по TCP.Мне приходиться брать структуру, и переворачивать каждый член структуры.А на другом конце по опкоду я знаю какая структура пришла и также переворачиваю каждый член структуры.Вопрос можно как то генерик способом взять объект типа структура, проверить каждое поле сколько бит 32, 16 и так далее и в соответствии с этим перевернуть поле?
24 ответа

jenya7

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


jenya7

Можно.Рефлексией перебрать все поля и для каждого получись смещение от начала структурыНа stackoverflow масса примеров
а как задать поиск в гугле? по каким словам?


jenya7

делаю так
void BigToLitle(object obj)
 {
 Type mytype = obj.GetType(); 
 if (mytype.Equals(typeof(struct))) 
 {
 } 
}
ругается. структура не тип. а что делать? структура не поддается рефлексии.


jenya7

jenya7, IsValueType


jenya7

ругается. структура не тип. а что делать?
Забить на программирование или учить матчасть.


jenya7

jenya7, IsValueType
не работает. и ValueType тоже


jenya7

не работает. и ValueType тоже
Печалька


jenya7

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


jenya7

Связать системы протоколом наследником. Т.е. выше уровнем.
Никакой протокол не перевернет ваши данные. вы сами должны разруливать эту ситуацию. если только протокол писанный руками. гораздо проще взять данные и перевернуть их. у меня данные в структурах. я ищу генерик способ перебрать все члены структуры и перевернуть их в соответствии с типом.


jenya7

jenya7,Ты о чём?В протоколе пересылается ключ=значение.Не надо переворачивать).


jenya7

хочется двоичный протокол - переворачивайте байты сколько влезет
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;
 ****** h;
 SByte w;
 fixed Int16 rr[5];
 Single v;
 int er;
 }


jenya7

структура
[StructLayout(LayoutKind.Sequential)]


jenya7

хочется двоичный протокол - переворачивайте байты сколько влезет
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;
 ****** h;
 SByte w;
 fixed Int16 rr[5];
 Single v;
 int er;
 }
спасибо большое. попробую. у меня есть сложные структуры. структура в структуре да еще массив внутри.


jenya7

на строчке
FixedBufferAttribute fa = (FixedBufferAttribute)fi.GetCustomAttribute(typeof(FixedBufferAttribute));
получаю ошибку
Severity Code Description Project File Line Suppression StateError 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?)


jenya7

сложные структуры. структура в структуре да еще массив внутри.
Как вариант сериализация объектов или json


jenya7

Как вариант сериализация объектов или json
после сериализации я не знаю где какой член структуры. нет возможности перевернуть. мне нужно перевернуть - сделать сериализацию - отправить.


jenya7

получаю ошибку
using System.Reflection;


jenya7

using System.Reflection;
включено. есть метод GetCustomAttributes но у него другие аргументы.


jenya7

после сериализации я
Сериализуют голые объекты. Без методов.ООП.Без неё - json


jenya7

using System.Reflection;
using System.Runtime.CompilerServices;
Современная студия умеет показывать где искать


jenya7

using System.Runtime.CompilerServices;
Современная студия умеет показывать где искать
включил. но все равно не находит GetCustomAttribute.


jenya7

GetCustomAttribute.
это метод экземпляра System.Reflection.FieldInfo