2010-02-25 50 views
1

我有一個字節數組(從客戶端發送爲字節數組的UTF-8編碼的字符串)。 該消息應具有以下格式:解析消息長度不確定的分隔符(最佳做法?)java

'數字' '時間戳' 'STR1' 'STR2'

例如

1 2000-01-31T20:00.00的第一str中的第二STR

很明顯,'數字'和'時間戳'很容易從字節數組中讀取。 'str1'的開始位置也可以被計算出來。 考慮到'str1'和'str2'可以有任何內容(任何長度),可以使用什麼類型的分隔符來知道'str1'結束和'str2'開始的時間?或者有沒有其他的技巧來解析這樣的事情。

note1:消息格式由我提供,所以只要所有4條信息位於字節數組中,任何具有不同格式/順序的解決方案都會執行。注意2:我知道我可以編碼str1,以便它不包含我的自定義分隔符,但是我想避免編碼/解碼數據的開銷。註釋3:我能想到的一個解決方案是在從客戶端發送數據時在其前面寫入str1的長度。 E.g'number''timestamp''str1length''str1''str2'

有沒有其他的技巧可以想到?

感謝

回答

1

我建議你做你列出的第三個選項:
數 時間戳  length_of_string1  字符串1   length_of_string_two  字符串2

它可能是一個壞主意,堅持字符串1和字符串像之間的分隔符「|」或「^]」,因爲那樣你就不能在你的字符串中有分隔符...

另外請注意,如果你發送一個字符串,如果它有空格將被拆分。解決這個問題的方法是做一個報價感知字符串分割和逃避的字符串,以「S

+0

嗨ItzWarty,謝謝你的回覆。 您給出的格式爲: number timestamp length_of_string1 string1 length_of_string_two string2。 我想我只需要length_of_string1而不是length_of_string2。由於字符串2的長度是從字符串1的末尾到字節數組的末尾。你有沒有別的想法? – Bob 2010-02-25 04:25:14

+0

我不知道@ItzWarty意思是不能發送「|」通過電線等... – 2010-02-25 05:09:05

+0

我見過一些項目,人們用管道分隔字符串「|」或「^]」,所以他們會發送string1 +「^]」+ string2或string1 +「|」+ string2 ...但您的字符串中不能有分隔符。我的措辭是......羅嗦,我編輯了我的主要帖子並修正了它。謝謝 – Warty 2010-02-25 05:21:13

0

圍繞它如果我有自由選擇的語法,我會做下列之一:

  • 如果有一些Unicode字符永遠不會出現在str1str2(爲了爭辯起見,它叫做'|'),我會連接4個組件和'|'作爲分隔符,然後我將使用「解析」字符串String.split("\\\\|");

  • 如果我不能確定我選擇的任何字符不會用於str1str2,我會選擇一個分隔符和轉義字符(如'|''\\'),並使用轉義字符來轉義字面值分隔符和文字轉義字符。構建消息然後解析它是更加努力的代碼,但它肯定會起作用。作爲第三種選擇,如果兩端都是Java,我會考慮使用Java數據流對數據進行編碼和解碼。