Кодирование таблиц данных
Любая таблица данных может кодироваться в или декодироваться из:
Строки Юникода
Байтового массива
Кодирование и декодирование строк часто используется для программного манипулирования таблицами данных, например, через Java SDK или .NET API. Строковое представление табличных форматов также часто используется для компактного и удобного для чтения отображения данных.
Кодирование и декодирование байтовых массивов используется для переноса таблиц данных по сети при помощи Коммуникационного протокола SberMobile или хранения их в базе данных SberMobile Server.
Кодирование байтовых массивов
Перекодирование таблицы данных в байтовый массив проходит в два этапа:
Во-первых, таблица данных кодируется в строку Юникода
Во-вторых, строка результата кодируется в байтовый массив при помощи кодировки UTF-8. См. документацию по UTF-8 (например, Статья в Wikipedia по UTF-8) для более подробного ознакомления.
Концепция кодирования строк
В целом, таблица данных и её различные части закодированы в строку как ряд элементов следующего формата:
<[element_name=]element_value>
Имя и значение могут включать любой символ, за исключением тех, которые использует протокол взаимодействия SberMobilel или тех, которые используются для кодирования самого элемента. Значение элемента может быть закодированным списком вложенных элементов.
Кодирование таблицы
Здесь представлен формат для закодированной таблицы данных:
<F=record_format>[<I=>][<R=record>][<R=record>]…
Имя элемента | Значение элемента |
| Дескриптор формата таблицы, определяющий имена и типы всех колонок в таблице данных или других свойств таблицы. О его кодировании говорится здесь. |
| ID формата таблицы. Более поробно см. раздел кэширование формата. |
| Элемент для проверки. Если данный элемент найден в таблице данных, вся таблица считается неверной. Когда SberMobile Server запрашивает значение переменной от агента, агент сначала подтверждает запрос, а затем начинает опрос записей с аппаратного устройства. В это время сервер "думает", что он получает полную и правильную таблицу. Если в этот момент возникает внезапный разрыв связи между агентом и устройством, и по какой-то причине агент не получает данные, которые он должен получать от аппаратного устройства, агент вставляет проверочный элемент в таблицу данных, отправляемую серверу. Этот элемент сообщает серверу, что он не может полностью получить все эти данные. После получения этого элемента сервер "знает", что операция не может быть полностью завершена. |
| Запись таблицы данных. Записи закодированы одна за другой. Формат закодированных записей описан ниже. |
| Временная метка таблицы данных. Обычно указывает на время создания/получения самой таблицы данных или выборки данных, которую она представляет. Временная метка кодируется в строку как количество миллисекунд с начала отсчета времени (1 января 1970 г.). |
| Качество таблицы. Оно объясняет, насколько надежна выборка данных, представленная таблицей данных. Качество является 32-битным подписанным целым значением, закодированным в строку. |
Пример: Этот пример показывает, что формат закодированной таблицы данных определяет одно поле строки, именуемое "IP", и что он содержит одну запись со значением "192.168.1.88". См. дополнительную информацию о записи и кодировке формата ниже. |
Кодировка формата таблицы
record_format
включён в каждую таблицу данных, даже если она пустая. Кодировка выглядит следующим образом:
<field_format><field_format>…[<F=flags>][<V=table_validators>][<R=record_validators>][M=min_records][X=max_records][<B=bindings>][<N=naming_expression>]
Элементы без идентификаторов (как показано в примере ранее <field_format>
) считаются дескрипторами закодированных форматов полей таблиц. Дескрипторы формата полей закодированы один за другим, начиная с самого первого поля.
Имя элемента | Значение элемента |
| Отсутствие или комбинация следующих флагов: “R” (Перемещаемый (Reorderable)) - указывает, что пользователи SberMobile могут перемещать во время редактирования ряды данной таблицы “U” (Неизменяемый (Unresizable)) - указывает, что пользователи не могут добавлять/удалять ряды во время редактирования таблицы. |
| Валидаторы таблиц, которые позволяют выполнять комплексное подтверждение всей таблицы. |
| Валидаторы записей, которые используются для подтверждения каждой записи. |
| Привязки таблиц. |
| Минимальное разрешённое количество записей в таблице. |
| Максимальное разрешённое количество записей в таблице. |
| Выражение имени таблицы. |
Пример: Этот формат, описывающий таблицу с одной ячейкой (одно поле, минимальное и максимальное количество записей тоже одно). Единственное имя таблицы - "date", и его тип - Дата. См дополнительную информацию о кодировании формата ниже. |
Пример: Этот формат описывает таблицу с двумя полями, которая может содержать от 0 до 255 записей. Первое поле строки называется "id", а его описание - "Card ID". У него есть валидатор, который ограничивает длину значения ровно до 10 знаков. Второе поле также представляет собой тип строки и называется "name". |
Кодирование формата поля
field_format
- это строка, описывающая одно поле в таблице данных. Оно форматируется следующим образом:
<name><type>[<F=flags>][<A=default>][<D=description>][<H=help>][<S=selection_values>][<V=validators>][<E=editor>]
У первых двух элементов нет имен. Первый элемент - имя поля, а второй содержит код типа поля (см таблицу ниже).
Имя элемента | Значение элемента |
| Отсутствие или комбинация следующих флагов: “ “ “ “ “ “ “ |
| Значение поля, по умолчанию закодированное в строку (см раздел кодирование значения ) |
| Описание поля |
| Подсказка поля (подробное описание). |
| Список значений выбора для поля. См. правила кодирования здесь. |
| Список валидаторов полей. См. правила кодирования здесь. |
| Код редактора/отрисовщика. Этот элемент активирует пользовательское визуальное представление значения поля. Поддерживаемые редакторы и отрисовщики представлены здесь. |
| Специфичные опции редактора. Опции, поддерживаемые каждым типом редактора/отрисовщика представлены здесь. Если опции редактора не определены, этот элемент должен быть опущен в определении формата таблицы. |
| Строковое ID иконки поля. |
| Группа полей. |
Пример: Это самый простой из возможных дескрипторов формата полей, который определяет поле целых чисел, называемых "значениями". |
Пример: Этот дескриптор формата определяет длинное поле (64-битное целое число) со значением по умолчанию, равным 30000. Описание поля - "Период проверки". У него есть валидатор ограничений, который ограничивает значения, диапазон которых составляет от 100 до 1000000. Тип редактора/отрисовщика инструктирует систему использовать редактора Периода времени для редактирования значения поля. |
Типы полей и кодирование значений
Код типа | Тип | Комментарии и правила кодирования значения | ||
| String | Да | Вставлено как есть | |
| Integer |
| Преобразовано в строку, например | |
| Long |
| Преобразовано в строку, например | |
| Boolean |
| TRUE закодировано как строка "1", а FALSE как строка "0" | |
| Float |
| Преобразовано в строку в соответствии с ниже приведёнными правилами. Все упомянутые символы являются символами ASCII.
Сколько цифр нужно ввести для дробной части m или a? Должна быть хотя бы одна цифра, чтобы представить дробную часть, плюс ровно столько цифр, сколько нужно, чтобы различить значение аргумента среди соседних значений типа Float (или Double, если обрабатывается число типа Double). То есть, предположим, что x - это точное математическое значение, представленное десятичным представлением, произведенным этим способом для конечного ненулевого аргумента d. Затем d должен стать значением типа Double, наиболее близким к x; или если два значения Double одинаково близки x, тогда d должен быть одним из них, а наименьшей мантиссой из d должен быть 0. | |
| Double |
| Правила, как для типа Float | |
| Date |
| Преобразовано в строку в форме "yyyy-MM-dd HH:mm:ss.SSS", где yyyy - год MM - месяц dd - день месяца HH - час (0-23) mm -минуты ss - секунды SSS -миллисекунды Конвертация должна использовать временную зону UTC. | |
| Data Table | Да | Таблица с включенными данными закодирована в строку согласно правилам Кодирования таблиц данных | |
| Color |
| Преобразовано в строку в форме "#RRGGBB", где RR - значение красного цвета (0-255) - шестнадцатеричная форма GG - значение зеленого цвета (0-255) -шестнадцатеричная форма BB - значение синего цвета (0-255) - шестнадцатеричная форма | |
| Data Block | Да | Конвертируется в строку в следующем виде: Version / ID / Name / Preview_length / Data_length / Preview Data Строка содержит несколько частей, разделенных символом
При перекодировании блока данных в строку байты Предпросмотра и Данных конвертируются в символы Юникода с кодами 0...255, т.е. символами ASCII. | |
Между полями Предпросмотр и Данные нет разделителя. Данные предпросмотра должны отделяться от основных данных в соответствии с их длиной, определённой Preview_length и Data_length. |
Кодирование значений выбора
Значения для поля выбора кодируются как список элементов. Каждое имя элемента - это видимое описание значения выбора для пользователя (то, что пользователь увидит в окне списка). Значения элемента - это значение выбора, закодированное в строку, как описано в разделе кодирование значения.
Пример: список трёх значений выбора для поля с целым числом можно закодировать следующим образом: |
Кодирование валидаторов
Валидаторы полей закодированы как список элементов, по одному для каждого валидатора. Имя элемента представляет собой код типа валидатора, а его значение содержит параметры, специфичные для валидатора.
Валидаторы полей
Список поддерживаемых валидаторов поля:
Код типа | Описание | Подходящие типы полей | Опции, характерные для валидатора |
L | Валидатор лимитов. Проверяет, входит ли значение в диапазон, заданный параметрами валидатора. | String, Integer, Long, Float, Data | Опции валидатора закодированы в строку как два целых числа, разделённые пробелом. Первое число обозначает минимальное значение диапазона, а второе число определяет максимальное. Эти числа имеют разное значение для разных типов полей: Для строковых полей эти параметры ограничивают минимальную и максимальную длину строки. Для целочисленных, длинных и плавающих полей они указывают минимальное и максимальное значение. Для полей с данными они ограничивают число байтов, которые могут содержаться в блоке данных. Границы включены для всех типов полей (т.е., ограничение "3" разрешило бы строке |
R | Валидатор регулярных выражений. Проверяет, соответствует ли значение строки регулярному выражению, заданному параметром валидатора. | String | Строка опций валидатора содержит регулярное выражение, которому значение поля должно соответствовать. За ним может следовать (не обязательно) сообщение об ошибке, отделённой от регулярного выражения строкой |
E | Валидатор выражений. Выполняет код выражения, используя значение этого поля как переменную среды | Подходят все типы полей | Текст выражения. |
I | Валидатор идинтификаторов. Проверяет, является ли значение уникальным среди всех значений в том же поле таблицы данных. | String, Number | Без дополнительных параметров. |
N | Ненулевой валидатор. Проверяет, является ли значение ненулевым. | Подходят все типы полей | Без дополнительных параметров. |
Пример 1: Если данный валидатор ограничений добавлен в формат поля строки, он разрешит лишь строки, длина которых составляет от 0 до 255 символов. Если он определён для целочисленных полей, он будет ограничивать значения полей до чисел, которые больше или равны 0 и меньше или равны 225. Пример 2:
Этот валидатор регулярных выражений проверяет, содержит ли поле правильный e-mail и отправляет сообщение об ошибке Invalid E-Mail, если адрес неправильный. За дополнительной информацией о регулярных выражениях обратитесь в раздел документации Синтаксис регулярных выражений. |
Валидаторы записей
Список поддерживаемых валидаторов записей:
Код типа | Описание | Опции, характерные для валидатора |
K | Ключевые поля. Проверяет, существует ли комбинация значений ключевых полей в таблице. Применяется во время добавления записи. | Отсутствуют - ключевые поля помечаются флажком Ключевое поле формата. |
Валидаторы таблиц
Список поддерживаемых валидаторов таблиц:
Код типа | Описание | Опции, характерные для валидатора |
K | Ключевые поля. Проверяет, является ли комбинация значений ключевых полей уникальной для каждой записи. | Отсутствуют - ключевые поля отмечены флажком Ключевое поле формата. |
E | Валидатор выражений. Оценивает выражение, имеющее данную таблицу как таблицу данных по умолчанию. Если выражение возвращает NULL, таблица считается верной, в ином случае вывод выражения конвертируется в строку и используется как текст сообщения об ошибке. | Текст выражения. |
Пример: Проверяет, больше ли одно поле другого. |
Кодировка пустых значений
Пустое значение NULL ("<Not set>") кодируется одним символом 0x1A (SUB). Это правило применяется для кодирования пустых (NULL) значения ячеек таблицы, значений по умолчанию для полей таблицы, значений выбора и любого другого места, где могут появиться значения поля.
Если для кодирования Таблицы данных используются видимые разделители, пустые (NULL) значения кодируются как символы "^".
Кодировка передачи
Значения поля кодируются при передаче для того, чтоб убрать символы, используемые форматом кодирования Таблицы данных и Коммуникационным протоколом SberMobile . Эти символы заменяются специальными шаблонами согласно следующей таблице:
Символ | Заменяется на |
0x25 (%) | %% |
0x02 (STX) | %^ |
0x0D (CR) | %$ |
0x17 (ETB) | %/ |
0x1C (FS) | %< |
0x1D (GS) | %> |
0x1E (RS) | %= |
Обратите внимание, что шаблоны в колонке "Заменяется на" являются символьными строками - это то, что Вы видите в таблице.
Кодирование записей данных
Каждая запись данных кодируется в строку согласно следующему формату:
[<I=record_ID>]<field_value><field_value>…
Элементы без имен - это значения поля. Значения полей кодируются одно за другим, в том же порядке, как они появляются в дескрипторе формата таблиц.
Имя элемента | Значение элемента |
| ID записи (Long number) |
Режимы кодирования строки
Каждую таблицу данных можно кодировать в двух режимах:
используя видимые разделители
используя невидимые разделители
Три специальных символа используются в качестве разделителей для кодирования:
Видимый разделитель | Невидимый разделитель (код) |
< | 0x1C |
> | 0x1D |
= | 0x1E |
В этом разделе во всех примерах используются видимые разделители. Единственное ограничение при кодировании таблицы с использованием видимых разделителей - все его элементы, которые закодированы в строку, не могут содержать данные разделители.