.NET Regular expressions on bytes instead of chars

前端 未结 4 1846
栀梦
栀梦 2020-12-29 07:46

I\'m trying to do some parsing that will be easier using regular expressions.

The input is an array (or enumeration) of bytes.

I don\'t want to convert the b

4条回答
  •  囚心锁ツ
    2020-12-29 08:16

    I personally went a different approach and wrote a small state machine that can be extended. I believe if parsing protocol data this is much more readable than regex.

    bool ParseUDSResponse(PassThruMsg rxMsg, UDScmd.Mode txMode, byte txSubFunction, out UDScmd.Response functionResponse, out byte[] payload)
    {
        payload = new byte[0];
        functionResponse = UDScmd.Response.UNKNOWN;
        bool positiveReponse = false;
        var rxMsgBytes = rxMsg.GetBytes();
    
        //Iterate the reply bytes to find the echod ECU index, response code, function response and payload data if there is any
        //If we could use some kind of HEX regex this would be a bit neater
        //Iterate until we get past any and all null padding
        int stateMachine = 0;
        for (int i = 0; i < rxMsgBytes.Length; i++)
        {
            switch (stateMachine)
            {
                case 0:
                    if (rxMsgBytes[i] == 0x07) stateMachine = 1;
                    break;
                case 1:
                    if (rxMsgBytes[i] == 0xE8) stateMachine = 2;
                    else return false;
                case 2:
                    if (rxMsgBytes[i] == (byte)txMode + (byte)OBDcmd.Reponse.SUCCESS)
                    {
                        //Positive response to the requested mode
                        positiveReponse = true;
                    }
                    else if(rxMsgBytes[i] != (byte)OBDcmd.Reponse.NEGATIVE_RESPONSE)
                    {
                        //This is an invalid response, give up now
                        return false;
                    }
                    stateMachine = 3;
                    break;
                case 3:
                    functionResponse = (UDScmd.Response)rxMsgBytes[i];
                    if (positiveReponse && rxMsgBytes[i] == txSubFunction)
                    {
                        //We have a positive response and a positive subfunction code (subfunction is reflected)
                        int payloadLength = rxMsgBytes.Length - i;
                        if(payloadLength > 0)
                        {
                            payload = new byte[payloadLength];
                            Array.Copy(rxMsgBytes, i, payload, 0, payloadLength);
                        }
                        return true;
                    } else
                    {
                        //We had a positive response but a negative subfunction error
                        //we return the function error code so it can be relayed
                        return false;
                    }
                default:
                    return false;
            }
        }
        return false;
    }
    

提交回复
热议问题