개발괴발🐾/C#

[Socket] 요청<->응답 바이트 배열 변환

OI코딩 2024. 3. 7. 17:21

*** SuperSocket (+ClientEngine, ProtoBase), Newtonsoft.Json 패키지를 활용합니다.

public class MyRequestInfo : IRequestInfo
    {
        public string Key => Type.ToString();

        /// <summary>
        /// 설비 데이터 요소
        /// </summary>
        public class Element
        {
            /// <summary>
            /// 속성명
            /// </summary>
            public string Name { get; set; }

            /// <summary>
            /// 값
            /// </summary>
            public string Value { get; set; }

            public Element() { }
            public Element(string name, string value)
            {
                Name = name;
                Value = value;
            }

            public Element(string name, object value)
            {
                Name = name;
                Value = value?.ToString() ?? string.Empty;
            }
        }

        /// <summary>
        /// 요청 유형
        /// </summary>
        public RequestType Type { get; set; }

        /// <summary>
        /// 설비번호. 
        /// </summary>
        public int MachineNumber { get; set; }

        /// <summary>
        /// 요소값 
        /// </summary>
        public List<Element> Elements { get; set; }
    }
public class MyResponseInfo : IPackageInfo
    {
        public bool Success { get; set; }

        public string Message { get; set; }

        public Dictionary<string, string> Data { get; set; }

        /// <summary>
        /// key: 설비번호, value: 에러목록
        /// </summary>
        public Dictionary<int, ErrorInfo[]> Errors { get; set; }
    }

 

public class DataConverter
    {
        /// <summary>
        /// 문자열 변환에 사용되는 인코딩
        /// </summary>
        private Encoding encoding = Encoding.UTF8;

        public DataConverter() { }

        public EFRequestInfo ToRequestInfo(byte[] data, int offset, int length)
        {
            string content = encoding.GetString(data, offset, length);
            
            return JsonConvert.DeserializeObject<MyRequestInfo>(content);
        }

        public EFResponseInfo ToResponseInfo(byte[] data, int offset, int length)
        {
            string content = encoding.GetString(data, offset, length);

            return JsonConvert.DeserializeObject<MyResponseInfo>(content);
        }


        public byte[] ToByte(MyRequestInfo requestInfo)
        {
            string content = JsonConvert.SerializeObject(requestInfo);

            byte[] body = encoding.GetBytes(content);

            byte[] header = BitConverter.GetBytes(body.Length);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(header);

            byte[] data = new byte[header.Length + body.Length];
            Array.Copy(header, data, header.Length);
            Array.Copy(body, 0, data, header.Length, body.Length);

            return data;
        }

        public byte[] ToByte(MyResponseInfo responseInfo)
        {
            string content = JsonConvert.SerializeObject(responseInfo);

            byte[] body = encoding.GetBytes(content);

            byte[] header = BitConverter.GetBytes(body.Length);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(header);

            byte[] data = new byte[header.Length + body.Length];
            Array.Copy(header, data, header.Length);
            Array.Copy(body, 0, data, header.Length, body.Length);

            return data;
        }


    }