разделитель для разбора сообщения с неизвестной длиной (наилучшая практика?) Java - PullRequest
1 голос
/ 25 февраля 2010

У меня есть байтовый массив (строка в кодировке UTF-8 отправляется как байтовый массив от клиента). Сообщение должно иметь следующий формат:

'число' 'отметка времени' 'str1' 'str2'

* 1005 например *

1 2000-01-31T20: 00.00 1-я улица 2-я улица

Понятно, что 'число' и 'метка времени' легко читаются из байтового массива. Начальная позиция 'str1' также может быть определена. Учитывая, что «str1» и «str2» могут содержать любой контент (любой длины), какой тип разделителя можно использовать, чтобы узнать, когда заканчивается «str1» и начинается «str2»? Или есть какие-то другие приемы для разбора чего-то подобного.

note1: формат сообщения предоставлен мной, поэтому любое решение с другим форматом / порядком будет работать до тех пор, пока все 4 фрагмента информации находятся в байтовом массиве.

note2: я знаю, что мог бы кодировать str1, чтобы он не содержал мой пользовательский разделитель, но я бы хотел избежать накладных расходов на кодирование / декодирование данных.

note3: Одним из решений, которое я мог придумать, было написать длину str1 перед ним при отправке данных со стороны клиента. Например, 'число' 'отметка времени' 'длина_строки' 'str1' 'str2'

Есть ли еще какие-нибудь хитрости, о которых вы можете подумать?

спасибо

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Я рекомендую вам сделать третий вариант, который вы перечислили:
номер отметки времени length_of_string1 string1 length_of_string_two string2

Вероятно, плохая идея вставлять разделитель между string1 и string2 как "|" или "^]", потому что тогда у вас больше не будет разделителя в строках ...

Также обратите внимание, что если вы отправляете строку, если в ней есть пробелы, она будет разделена. Чтобы решить эту проблему, нужно разбить строку с учетом кавычек и экранировать строку, заключив ее в "s

0 голосов
/ 25 февраля 2010

Если бы у меня была свобода выбора синтаксиса, я бы сделал одно из следующих действий:

  • Если есть какой-либо символ Unicode, который никогда не появится в str1 и str2 (назовите его '|' в качестве аргумента), я бы объединил 4 компонента с '|' в качестве разделителя.Затем я бы "проанализировал" строку, используя String.split("\\\\|");

  • Если бы я не был уверен, что выбранный мной символ не будет использоваться в str1 или str2Я бы выбрал символ-разделитель и escape-символ (скажем, '|' и '\\') и использовал escape-символ для экранирования буквального разделителя и буквального escape-символа.Построение сообщения, а затем его синтаксический анализ требуют больше усилий для кодирования, но оно определенно будет работать.

  • В качестве третьей альтернативы, если бы оба конца были Java, я бы рассмотрел использование потоков данных Java длякодировать и декодировать данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...