모드버스 통신처리를 최적화 하기위해 Span을 활용해 원 바이너리메모리에 직접적으로 Swap과 캐스팅 처리할수있도록 구현했다.

불필요한 가비지나 연산과정이 최소화 될듯하나 측정하거나 디버그 해보진 않았다.

아래는 사용예이다.


    unsafe struct SwapBig<T> where T : unmanaged

    {

        static int size = sizeof(T);

        static int siz = size - 1;


        delegate void SwapAction(byte[] swap, Span<byte> raw, Span<byte> val, int i);

        static SwapAction get = BitConverter.IsLittleEndian ? static (swap, raw, val, i) => { val[swap[i]] = raw[siz - i]; } : static (swap, raw, val, i) => { val[swap[i]] = raw[i]; };

        static SwapAction set = BitConverter.IsLittleEndian ? static (swap, raw, val, i) => { raw[siz - i] = val[swap[i]]; } : static (swap, raw, val, i) => { raw[i] = val[swap[i]]; };


        public T this[params byte[] swap]

        {

            get

            {

                T value;

                fixed (void* _this_ = &this)

                {

                    var raw = new Span<byte>(_this_, size);

                    var val = new Span<byte>(&value, size);

                    for (int i = 0; i < size; i++)

                        get(swap, raw, val, i);

                }

                return value;

            }

            set

            {

                fixed (void* _this_ = &this)

                {

                    var raw = new Span<byte>(_this_, size);

                    var val = new Span<byte>(&value, size);

                    for (int i = 0; i < size; i++)

                        set(swap, raw, val, i);

                }

            }

        }

    }