С# Инверсия байтов при маршалинге в структуру

234
21 октября 2017, 15:36

При попытке маршалинга бинарных данных в структуру происходит инверсия байтов внутри полей структуры т.е. в приведённом коде buffer[0]=0x1A, buffer[1]=0x2A но в самой структуре переменная header.test1=0x2A1A.

 using System.Runtime.InteropServices;
 namespace Test
  {
[StructLayout(LayoutKind.Sequential, Pack = 1)]
 unsafe public struct TESTstruct
{
    public System.UInt16 test1;    
    public fixed System.UInt16 test2 [4];    
}
class Program
{
    static void Main(string[] args)
    {
    string path = "C:\\TEMP\\test1";
        using (FileStream fswrite= File.OpenWrite(path))
        {
            if (fswrite.CanWrite)
            {
                byte[] testline =
                {
                    0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 0x8A, 0x9A, 0x0A, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B,
                    0x7B, 0x8B, 0x9B
                };
                fswrite.Write(testline,0,testline.Length);
            }
        }

        using(FileStream fstream = File.OpenRead(path))
        {
            if (fstream.CanRead)
            {
               byte[] tempbuff= new byte[Marshal.SizeOf(typeof(TESTstruct))] ;
                Console.WriteLine(Marshal.SizeOf(typeof(TESTstruct)));
                TESTstruct header;
                 header = ReadStruct<TESTstruct>(fstream);
            }
            else
            {
              Console.WriteLine("Error");  
            }
        }

        Console.ReadKey();
    }
    static public T ReadStruct<T>(FileStream fs)
    {
        byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
        fs.Read(buffer, 0, Marshal.SizeOf(typeof(T)));
        GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        T temp = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
        handle.Free();
        return temp;
    }
}

Вопрос: почему происходит данная инверсия и связано ли это с порядком байтов в памяти?

READ ALSO
Проверка на дубликаты c#

Проверка на дубликаты c#

Собственно есть файл с уникальными строками, их допустим 6кк, и есть вторая 2кк, нужно проверить базу 2кк на наличие в базе 6кк, и выдать только...

305
Получаю зацикленность кода

Получаю зацикленность кода

Всем добрый деньРазбирал пример шаблонного метода на основе делегатов, который используется при работе с WCF сервисами

280
WPF цветовая схема

WPF цветовая схема

Доброго дня! Хочу сделать разделение ресурсов между сборками, так как показано здесь: https://professorwebru/my/WPF/binding_and_styles_WPF/level10/10_7

312
глобально изменить переменную C#

глобально изменить переменную C#

Дело в том что у меня изменяется глобальная переменная внутри блока try, но другой блок не хочет видеть ее измененияИзменял банально x = int

260