解析具有未知长度的消息的分隔符(最佳实践?)java

时间:2010-02-25 04:07:26

标签: java parsing

我有一个字节数组(UTF-8编码的字符串从客户端发送为字节数组)。 消息应具有以下格式:

'数字''时间戳''str1''str2'

E.g

1 2000-01-31T20:00.00第一个str第二个str

很明显,很容易从字节数组中读取'number'和'timestamp'。 'str1'的起始位置也可以计算出来。 考虑到'str1'和'str2'可以包含任何内容(任何长度),可以使用什么类型的分隔符来知道'str1'何时结束和'str2'何时开始?还是有任何其他技巧可以解析这样的事情。

note1:消息格式由我提供,因此只要所有4条信息都在字节数组中,任何具有不同格式/顺序的解决方案都可以。

note2:我知道我可以对str1进行编码,使其不包含我的自定义分隔符,但我希望避免编码/解码数据的开销。

note3:我能想到的一个解决方案是在从客户端发送数据时在其前面写入str1的长度。 例如'number''时间戳''str1length''str1''str2'

你能想到其他任何技巧吗?

感谢

2 个答案:

答案 0 :(得分:1)

我建议你做你列出的第3个选项:
number timestamp length_of_string1 string1 length_of_string_two string2

在string1和string2之间粘贴分隔符可能是一个坏主意,如“|”或者“^]”,因为那时你的字符串中不再有分隔符......

另请注意,如果您要发送字符串,如果它有空格,则会将其拆分。解决这个问题的方法是通过执行引语识别字符串拆分并转义字符串,用“s

包围它

答案 1 :(得分:0)

如果我有自由选择语法,我会做以下其中一项:

  • 如果某个Unicode字符永远不会出现在str1str2中(为了参数而称之为'|'),我会连接4以'|'为分隔符的组件。然后我将使用String.split("\\\\|");

  • “解析”字符串
  • 如果我无法确定我选择的任何字符不会在str1str2中使用,我会选择一个分隔符和一个转义字符(比如说) '|''\\')并使用转义字符来转义文字分隔符和文字转义字符。构建消息然后解析它是更费力的代码,但它肯定会起作用。

  • 作为第三种选择,如果两端都是Java,我会考虑使用Java数据流对数据进行编码和解码。