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);
    }
}