통신 프로토콜 처리시 아스키 문자와 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);
}
}
'SW > C#' 카테고리의 다른 글
메소드 가변 파라메터 params (0) | 2022.02.05 |
---|---|
날짜, 시간 비교 처리 DateTime.Compare (0) | 2020.08.11 |
문자열16진수를 바이트 형태로 변환 / 특정 문자로 바이트 분리 (0) | 2020.08.08 |
Timer Task 타이머 타스크 (0) | 2020.07.28 |
string byte copy 스트링 바이트 복사 Array.Copy 조합, combine (0) | 2020.07.27 |