Небезопасный код. Битовое чтение файла и преобразование к определенному формату - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Решаю задачу битового чтения файла и преобразование к определенному формату. Реализовал следующим образом
    [StructLayout(LayoutKind.Sequential)]
    struct SHP_Header
    {
        int FileCode;
       .........
        double Mmax; 
    }
        private SHP_Header ReadHeader()
        {
            byte[] buffer = new byte[100];
            fileStram.Read(buffer, 0, 100);
            SHP_Header l_header=new SHP_Header();
            unsafe
            {
                IntPtr ptr = Marshal.AllocHGlobal(100);
                Marshal.Copy(buffer, 0, ptr, 100);                
                l_header = (SHP_Header) Marshal.PtrToStructure(ptr,typeof(SHP_Header));
            }
            return l_header;
        }
Подскажите пожалуйста есть ли более оптимальная реализация. А то приходится создавать два буфера и производить чтение буфера, копирование в другой буфер и потом только преобразовать к структуре. Может можно попроще, а то я неуверен. Заранее спасибо за ответы

Решение задачи: «Небезопасный код. Битовое чтение файла и преобразование к определенному формату»

textual
Листинг программы
    enum ShapeType
    {
        NullShape = 0,
        Point = 1,
        PolyLine = 3,
        Polygon = 5,
        MultiPoint = 8,
        PointZ = 11,
        PolyLineZ = 13,
        PolygonZ = 15,
        MultiPointZ = 18,
        PointM = 21,
        PolyLineM = 23,
        PolygonM = 25,
        MultiPointM = 28,
        MultiPatch = 31
    }
 
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    unsafe struct ShpHeader
    {
        public int FileCode;
        private fixed int Unused [5];
        public int FileLength;
        public int Version;
        public ShapeType ShapeType;
        public double Xmin;
        public double Ymin;
        public double Xmax;
        public double Ymax;
        public double Zmin;
        public double Zmax;
        public double Mmin;
        public double Mmax;
    }
 
    unsafe static class DataTransformer
    {
        public static ushort EndianSwap ( ushort x )
        {
            return (ushort)((x >> 8) | (x << 8));
        }
 
        public static int EndianSwap ( int x )
        {
            return (x >> 24) |
                ((x << 8) & 0x00FF0000) |
                ((x >> 8) & 0x0000FF00) |
                (x << 24);
        }
 
        public static long EndianSwap ( long x )
        {
            return (x >> 56) |
                ((x << 40) & 0x00FF000000000000) |
                ((x << 24) & 0x0000FF0000000000) |
                ((x << 8) & 0x000000FF00000000) |
                ((x >> 8) & 0x00000000FF000000) |
                ((x >> 24) & 0x0000000000FF0000) |
                ((x >> 40) & 0x000000000000FF00) |
                (x << 56);
        }
    }
 
    public unsafe class ShpReader
    {
        private ShpHeader mHeader;
        private readonly Stream mStream;
        private byte[] mBuffer;
 
        public ShpReader ( Stream stream )
            : this()
        {
            mStream = stream;
            ReadHeader();
        }
 
        private ShpReader ( )
        {
            mBuffer = new byte[4096];
        }
 
        private void ReadHeader ( )
        {
            mStream.Read( mBuffer, 0, mBuffer.Length );
 
            fixed ( byte* ptr = mBuffer )
                mHeader = *(ShpHeader*)ptr;
 
            mHeader.FileCode = DataTransformer.EndianSwap( mHeader.FileCode );
            mHeader.FileLength = DataTransformer.EndianSwap( mHeader.FileLength );
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы