Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从字节缓冲区生成xml消息_Java_Xml_State Machine - Fatal编程技术网

Java 从字节缓冲区生成xml消息

Java 从字节缓冲区生成xml消息,java,xml,state-machine,Java,Xml,State Machine,我有一个传递字节数组的函数。这些字节可以包含xml消息的一部分、一个整体或一个整体和一部分。我已经成功地使用状态机尝试解析消息,直到今天,我们才意识到,如果第二个源向我们发送数据,我可以获取消息的前半部分,并在第二个源的另一条消息开始之后立即获取。我希望能够通过丢弃不正常的消息来纠正这一点。我不认为我应该把它保存起来,直到完成为止 这是我的状态机: for (int i = 0; i < bytes.length; i++) { byte data = bytes[

我有一个传递字节数组的函数。这些字节可以包含xml消息的一部分、一个整体或一个整体和一部分。我已经成功地使用状态机尝试解析消息,直到今天,我们才意识到,如果第二个源向我们发送数据,我可以获取消息的前半部分,并在第二个源的另一条消息开始之后立即获取。我希望能够通过丢弃不正常的消息来纠正这一点。我不认为我应该把它保存起来,直到完成为止

这是我的状态机:

for (int i = 0; i < bytes.length; i++)
    {
        byte data = bytes[i];

        //based on the read state, perform an action.  This is attempting to 
        //determine if we are reading the beginning of a message, or the end of the message.
        if (bufferIndex == BmsConstants.MAX_DRAWING_LENGTH)
        {
            resetState();               
        }

        switch (readState)
        {
            case SYNC:
                //we've read:  <
                if (data == '<')
                {
                    readState = DrawingDeviceParserState.START_LT;
                    buff[bufferIndex++] = (char) data;
                } else
                {
                    resetState();
                }
                break;
            case START_LT:
                //we've read:  <?
                if (data == '?')
                {
                    readState = DrawingDeviceParserState.START_QM;
                    buff[bufferIndex++] = (char) data;
                } else
                {
                    resetState();
                }
                break;
            case START_QM:
                //we've read:  <?x
                if (data == 'x')
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                } else
                {
                    resetState();
                }
                break;
            case START_X:
                //we've read:  <, now just read until we get to the </event>
                if (data == '<')
                {
                    readState = DrawingDeviceParserState.END_LT;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_LT:
                //we've read:  </
                if (data == '/')
                {
                    readState = DrawingDeviceParserState.END_SLASH;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_SLASH:
                //we've read:  </e
                if (data == 'e')
                {
                    readState = DrawingDeviceParserState.END_E;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_E:
                //we've read:  </ev
                if (data == 'v')
                {
                    readState = DrawingDeviceParserState.END_V;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_V:
                //we've read:  </eve
                if (data == 'e')
                {
                    readState = DrawingDeviceParserState.END_E1;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_E1:
                //we've read:  </even
                if (data == 'n')
                {
                    readState = DrawingDeviceParserState.END_N;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_N:
                //we've read:  </event
                if (data == 't')
                {
                    readState = DrawingDeviceParserState.END_T;
                    buff[bufferIndex++] = (char) data;
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
            case END_T:
                //we've read:  </event>  
                //End of the message, now we can parse it.
                if (data == '>')
                {
                    //readState = DrawingDeviceParserState.END_GT;
                    buff[bufferIndex++] = (char) data;

                    parseXml(new String(buff, 0, bufferIndex));
                    resetState();
                }
                else
                {
                    readState = DrawingDeviceParserState.START_X;
                    buff[bufferIndex++] = (char) data;
                }
                break;
        }
    }
for(int i=0;i如果(data=='不确定具体问题是什么。我对我的问题进行了澄清。我认为您正在处理一种非常特定的xml格式?您似乎假设xml采用单字节编码。我不知道您希望如何处理任意混乱的消息?在我看来,您的问题是在您开始解析之前。我可以避免d进入断开消息的状态(如果可能的话)。这并不是因为它太具体,只是我不知道消息中有什么。我知道它是xml,但我不知道它是一条完整的消息还是多条消息,等等。这就是为什么我使用状态机来确保我得到了适当的标记。我不觉得这是最好的方法,这就是为什么我要发布这个问题的原因。