SW/C#
바이트 byte 버퍼 저장.. 통신 처리에서 사용.
또난
2020. 8. 10. 23:19
통신 프로토콜 처리시 아스키 문자와 byte 혼합하여 사용할때...
String을 byte 로 변환하면 128자 이상부터 깨짐..
꼼수로 String을 byte 형태로 저장 후 계산 처리할때 실제 byte 로 변환하여 처리함.
private string RcvStrData = string.Empty;
private void TcpClient_DataRecived(object sender, SimpleTCP.Message e)
{
string RxString = string.Empty;
string strDateLen = DateTime.Now.ToString("[HH:mm:ss:fff (") + Convert.ToString(e.Data.Length) + ")]";
for (int i = 0; i < e.Data.Length; i++) RxString += " " + e.Data[i].ToString("X2");
txtRcvMsg.Invoke((MethodInvoker)delegate ()
{
if(DpHex) txtRcvMsg.AppendText(strDateLen + RxString + Environment.NewLine); // 자동 하단 스크롤 적용.
});
if (logEn)
{
logData += strDateLen + RxString;
logTimer = 5;
}
//RcvData = e.Data;
RcvDataTimer = 30;
RcvStrData += RxString; // byte 모형?의 string 형태로 누적 저장.
}
if (RcvStrData.Length > 0)
{
RcvCnt++;
string str = RcvStrData.TrimStart(); // 처음 공백을 제거해야 변환시 인덱스 에러 나지 않음.
byte[] RcvByte = str.Split(' ').Select(s => Convert.ToByte(s, 16)).ToArray();
Console.WriteLine("RcvByte Len {0} RcvCnt {1}", RcvByte.Length, RcvCnt);
RcvStrData = string.Empty;
char[] splitId = { 'M', 'B', 'C', 'R', 'x', '0', '0' }; // 4D 42 43 52 30
resultRcvData = RcvdataSplit(splitId, RcvByte); // splitId 기준으로 byte 데이터 자르고 리스트 갱신.
RcvDataSplitCnt = resultRcvData.Count;
if (RcvDataSplitCnt == 0) Console.WriteLine("cal RcvDataSplitCnt cnt {0}", RcvDataSplitCnt);
else
{
RcvDataSplitCnt = resultRcvData.Count;
Console.WriteLine("cal RcvDataSplitCnt cnt {0}", RcvDataSplitCnt);
}
}