Netstring - Netstring
В компьютерное программирование, а netstring это метод форматирования для байтовые строки который использует декларативную нотацию для указания размера строки.[1][2]
Netstrings хранит байтовую длину следующих данных, что упрощает однозначную передачу текста и байтовых данных между программами, которые могут быть чувствительны к значениям, которые могут быть интерпретированы как разделители или терминаторы (например, нулевой символ ).
Формат состоит из длины строки, записанной с использованием цифр ASCII, за которыми следует двоеточие, байтовые данные и запятая. «Длина» в этом контексте означает «количество 8-битных единиц», поэтому, если строка, например, закодирована с использованием UTF-8, это может быть или не совпадать с количеством текстовых символов, присутствующих в строке.
Например, текст «привет, мир!» кодируется как:
<31 32 3а 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>
т.е.
12:Привет, мир!,
И пустая строка как:
<30 3а 2c>
т.е.
0:,
Запятая упрощает людям чтение цепочек, которые используются в качестве смежных записей, и обеспечивает слабую проверку правильности синтаксического анализа. Обратите внимание, что без запятой формат отражает то, как Bencode кодирует строки.
Длина записывается без ведущих нулей. Пустая строка - это единственная строка сети, которая начинается с нуля. Существует ровно одна допустимая кодировка строки сети для любого байтовая строка.
Поскольку формат легко сгенерировать и разбирать, его легко поддерживать программами, написанными на разных языках программирования. На практике строки цепей часто используются для упрощения обмена строками байтов или списками строк байтов. Например, см. Его использование в Простой общий интерфейс шлюза (SCGI) и Протокол быстрой очереди почты (QMQP).
Netstrings позволяет избежать сложностей, возникающих при попытке внедрить произвольные данные в форматы с разделителями. Например, XML может не содержать определенных байтовых значений и требует нетривиальной комбинации побег и разграничение, генерируя составные сообщения MIME включает в себя выбор разделителя, который не должен противоречить содержанию данных.
Сетевые строки могут храниться рекурсивно. Результатом кодирования последовательности строк является одна строка. Переписывая вышеупомянутое "hello world!" Например, чтобы вместо этого быть последовательностью из двух цепей, которая сама закодирована как одна цепочка, дает следующее:
17:5:Привет,6:Мир!,,
Разбор такой вложенной сетевой цепочки является примером утка печатать, поскольку содержащаяся в нем строка ("5: hello, 6: world !,") является одновременно строкой и последовательностью сетевых строк. Его эффективный тип определяется тем, как приложение решает его интерпретировать, а не каким-либо явным объявлением типа, требуемым спецификацией netstring. В общем, существует 3 способа, которыми программа, ожидающая netstring, может выбрать интерпретацию его содержимого:
- Как текст, читаемый человеком, без дальнейшей автоматической обработки
- В качестве инкапсулированные данные в некоторых заранее оговоренных фиксированных сериализация данных формат (например, двоичное содержимое структуры C или C ++)
- В инкапсулированном виде метаданные и данные, используя помеченный союз соглашение для описания типов вложенных цепей, тем самым устанавливая самоописывающий формат иерархической сериализации данных. ("Сетевые строки с тегами" и Bencode можно рассматривать как расширения netstring, которые поддерживают похожие иерархические форматы с самоописанием[3][4][5][6][7])
Обратите внимание, что, поскольку строки цепочки не накладывают ограничений на содержимое хранимых в них данных, строки цепей не могут быть встроены дословно в большинство форматов с разделителями без возможности вмешательства в разделение содержащего их формата.
В контексте сетевого программирования потенциально полезно, чтобы принимающая программа была проинформирована о размере следующих данных, поскольку она может выделить памяти, избегайте необходимости перераспределения для размещения большего количества данных и упреждающе отклоняйте данные, которые могут превышать ограничения по размеру.
Смотрите также
Примечания и ссылки
- ^ определено в документе Д. Дж. Бернштейн.
- ^ См. Например Веб-программирование на PythonСтив Холден, Дэвид М. Бизли Опубликовано Sams Publishing, 2002 г.ISBN 0-7357-1090-2, 978-0-7357-1090-0691 стр., Стр. 202.
- ^ Каолан МакМахон."Бенкодинг".
- ^ «Спецификация TNetstrings». Архивировано из оригинал 10 февраля 2014 г.
- ^ tnetstring-rb
- ^ "tnetstring: спецификация тегированной сетевой строки"
- ^ "tnetstring: сериализация данных с использованием типизированных сетевых строк"