개발괴발🐾/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;
}
}