Оглавление
1. Типов данных не существует
Данные между компьютерами передаются с помощью пакетов.
Первое правило, которое стоит усвоить. Такой вещи, как типы данных не существует. Любой объект, с которым вы работаете в программе, это последовательность байт, которые для удобства представлены единым объектом. Важной особенностью является то, что под разными платформами и на разных системах данные хранятся по-разному.
Поэтому для сервера требуется определить протокол взаимодействия с ним: то как именно, какие данные и в каком порядке передаются.
2. Протокол
Для того, чтобы составить или интерпретировать пакет, надо знать правила его построения. Пакет состоит из нескольких разделов разной длины, содержащих какую-то информацию, например:
Но несмотря на 1 первый пункт, зачастую нам приходится иметь дело с некоторыми стандартными типами, например, с числами и строками.
3. Числа
Самый простой из универсальных типов данных - это число. Для того, чтобы однозначно интерпретироваться при чтении, число должно иметь фиксированную длину, т.е. занимать определённое число байт.
Тогда запись и чтение происходит с помощью двух простых циклов. Приведу пример записи на питоне: запись осуществляется в bytearray, являющийся массивом байт, размер которого автоматически увеличивается:
- def append_number(data: bytearray, number: int, size: int):
- '''Первым аргументом идёт bytearray.
- Вторым идёт число, которое должно быть добавлено,
- третьим размер добавляемого числа.
- Процедура добавит это число в последовательность data'''
- for i in range(size):
- data.append(number & 255)
- number = number >> 8
Вы можете самостоятельно написать обратное преобразование.
4. Строки
Строки используются также часто, как и числа. Но, одновременно с этим, это далеко не самый простой тип данных. Для того, чтобы отправить и прочитать строку, надо выбрать кодировку. Существует много видов кодировок, в данный момент (2021г) рекомендуется использовать кодировку UTF-8.
Большинство современных фреймворков и языков хранят строку в своём внутреннем представлении и предоставляют возможность кодировать строку в различных кодировках. В библиотеке языка Python есть метод encode для кодирования и decode для чтения.
После перевода в двоичный вид, есть 3 стандартных способа отправить строку: нультерминированная строка, строка фиксированной длины, строка с указанным размером.
Первый способ подразумевает отправку строки, последний символ которой имеет код 0. Строка считывается до тех пор, пока не встречен 0. Раздел под строку имеет нефиксированный размер.
Второй способ: строка должна содержать заранее определённое число символов. Возможна комбинация с первым и третьим способом, тогда размер раздела фиксируется.
Третий способ: вместе со строкой мы отправляем число - её размер. Размер отправляется перед самой строкой. Раздел под строку имеет нефиксированный размер.