Дружественный к JavaScript бинарный безопасный формат данных (не JSON или XML) - PullRequest
4 голосов
/ 01 апреля 2011

Прежде всего: JSON и XML не являются опцией в данном конкретном случае, пожалуйста, не предлагайте их. Если это облегчает принятие этого факта, представьте, что я намерен заново изобрести колесо для самообразования.

Вернуться к сути:

Мне нужно разработать бинарно-безопасный формат данных для кодирования некоторых дейтаграмм, которые я отправляю на определенный тупой сервер, который я пишу (в C, если это имеет значение).

Чтобы упростить вопрос, допустим, что я отправляю только цифры, строки и массивы.

Важный факт: Сервер ничего не знает (и не должен знать) о Юникоде и прочем. Он обрабатывает все строки как двоичные объекты (и никогда не заглядывает внутрь них).

Формат, который я первоначально разработал, выглядит следующим образом:

  • датаграмма: <Number:size>\n<Value1>...<ValueN>
  • Значение:
    • Номер: N\n<Value>\n
    • Строка: S\n<Number:size-in-bytes>\n<bytes>\n
    • Массив: A\n<Number:size>\n<Value0>...<ValueN>
* +1034 * Пример: * * одна тысяча тридцать пять
[ 1, "foo", [] ]

Сериализуется следующим образом:

1   ; number of items in datagram
A   ; -- array --
3   ; number of items in array
N   ; -- number --
1   ; number value
S   ; -- string --
3   ; string size in bytes
foo ; string bytes
A   ; -- array --
0   ; number of items in array

Проблема в том, что я не могу надежно получить размер строки в байтах в JavaScript.

Итак, вопрос в том, как изменить формат, чтобы строка могла быть сохранена как в JS, так и аккуратно загружена в C.

Я не хочу добавлять поддержку Unicode на сервер.

И я не очень хочу декодировать строки на сервере (скажем, из base64 или просто в unescape \ xNN последовательности) - это потребует работы с динамическими строковыми буферами, что, учитывая, насколько тупой сервер, не очень желательно ...

Есть какие-нибудь подсказки?

1 Ответ

1 голос
/ 01 апреля 2011

Кажется, что чтение UTF-8 на простом C не так уж страшно в конце концов. Поэтому я расширяю протокол для обработки строк UTF-8. (Но оценим ответ на этот вопрос в его нынешнем виде.)

...