binary
-
NAME
- binary — Вставка и извлечение полей из двоичных строк
- SYNOPSIS
- DESCRIPTION
- BINARY ENCODE AND DECODE
-
base64
-
-maxlen length
- -wrapchar character
- -strict
- hex
- -strict
- uuencode
-
-maxlen length
- -wrapchar character
- -strict
-
-maxlen length
- BINARY FORMAT
-
a
- A
- b
- B
- H
- h
- c
- s
- S
- t
- i
- I
- n
- w
- W
- m
- f
- r
- R
- d
- q
- Q
- x
- X
- @
- A
- BINARY SCAN
-
a
- A
- b
- B
- H
- h
- c
- s
- S
- t
- i
- I
- n
- w
- W
- m
- f
- r
- R
- d
- q
- Q
- x
- X
- @
- A
- PORTABILITY ISSUES
- EXAMPLES
- SEE ALSO
- KEYWORDS
Имя
binary — Вставка и извлечение полей из двоичных строкСинтаксис
binary decode формат ?-опция значение ...? данныеbinary encode формат ?-опция значение ...? данные
binary format строка_формата ?арг арг ...?
binary scan строка строка_формата ?имя_переменной имя_переменной ...?
Описание
Эта команда предоставляет средства для работы с двоичными данными. Подкоманда binary format создаёт двоичную строку из обычных значений Tcl. Например, если даны значения 16 и 22, на 32-битной архитектуре, она может создать 8-байтовую двоичную строку, состоящую из двух 4-байтовых целых чисел, по одному для каждого из чисел. Подкоманда binary scan делает обратное: она извлекает данные из двоичной строки и возвращает их в виде обычных значений Tcl. Подкоманды binary encode и binary decode преобразуют двоичные данные в или из строковых кодировок, таких как base64 (например, используемых в сообщениях MIME).Обратите внимание, что другие операции с двоичными данными, такие как извлечение подпоследовательности, получение длины или переинтерпретация её как строки в какой-либо кодировке, выполняются другими командами Tcl (соответственно string range, string length и encoding convertfrom в примерах). Двоичная строка в Tcl — это строка, все символы которой находятся в диапазоне \u0000-\u00FF.
Двоичное кодирование и декодирование
При кодировании двоичных данных в удобочитаемую строку исходные двоичные данные передаются команде binary encode вместе с именем кодировки и всеми желаемыми параметрами кодировки. Данные, которые были закодированы, могут быть преобразованы обратно в двоичный формат с помощью команды binary decode. Поддерживаются следующие форматы и параметры.- base64
- Двоичная кодировка base64 обычно используется в сообщениях электронной почты и XML-документах и использует в основном заглавные и строчные буквы и цифры. Она отличается способностью к произвольному повторному разбиению без потери информации.
При кодировании поддерживаются следующие параметры:
- -maxlen длина
- Указывает, что вывод должен быть разделён на строки, длина каждой из которых не более длина символов. По умолчанию строки не разбиваются.
- -wrapchar символ
- Указывает, что при разделении строк из-за параметра -maxlen должен использоваться символ символ для разделения строк. По умолчанию это символ новой строки «\n».
При декодировании поддерживаются следующие параметры:
- -strict
- Указывает декодеру генерировать ошибку при обнаружении пробельных символов. В противном случае они игнорируются.
- hex
- Двоичная кодировка hex преобразует каждый байт в пару шестнадцатеричных цифр в формате big-endian.
При кодировании параметры не поддерживаются. При декодировании поддерживаются следующие параметры:
- -strict
- Указывает декодеру генерировать ошибку при обнаружении пробельных символов. В противном случае они игнорируются.
- uuencode
- Двоичная кодировка uuencode раньше широко использовалась для передачи данных между Unix-системами и в новостных группах, но в наши дни менее распространена, в основном вытеснена кодировкой base64.
При кодировании поддерживаются следующие параметры (хотя изменение их может привести к созданию файлов, которые другие реализации декодеров не смогут обработать):
- -maxlen длина
- Указывает, что вывод должен быть разделён на строки, длина каждой из которых не более длина символов. По умолчанию строки разбиваются каждые 61 символ, и это значение должно быть в диапазоне от 3 до 85 из-за ограничений кодировки.
- -wrapchar символ
- Указывает, что при разделении строк из-за параметра -maxlen должен использоваться символ символ для разделения строк. По умолчанию это символ новой строки «\n».
При декодировании поддерживаются следующие параметры:
- -strict
- Указывает декодеру генерировать ошибку при обнаружении неожиданных пробельных символов. В противном случае они игнорируются.
Обратите внимание, что ни кодер, ни декодер не обрабатывают заголовок и подвал формата uuencode.
Двоичный формат
Команда binary format генерирует двоичную строку, структура которой задаётся строкой_формата, а содержимое берётся из дополнительных аргументов. Результирующее двоичное значение возвращается.строка_формата состоит из последовательности одного или более спецификаторов полей, разделённых нулём или более пробелами. Каждый спецификатор поля представляет собой один символ типа, за которым следует необязательный символ флага и необязательное числовое количество. Большинство спецификаторов типов используют один аргумент, чтобы получить значение, подлежащее форматированию. Символ типа указывает, как будет форматировано значение. количество обычно указывает, сколько элементов указанного типа берётся из значения. Если оно присутствует, количество — это неотрицательное десятичное число или *, что обычно указывает на использование всех элементов значения. Если количество аргументов не соответствует количеству полей в строке формата, потребляющих аргументы, то генерируется ошибка. Символ флага игнорируется для binary format.
Вот небольшой пример, чтобы прояснить связь между спецификаторами полей и аргументами:
binary format d3d {1.0 2.0 3.0 4.0} 0.1 Первый аргумент — список из четырёх чисел, но из-за количества 3 для соответствующего спецификатора поля будут использованы только первые три. Второй аргумент связан со вторым спецификатором поля. Результирующая двоичная строка содержит числа 1.0, 2.0, 3.0 и 0.1.
Каждая пара «тип-счёт» перемещает воображаемый курсор через двоичные данные, сохраняя байты в текущей позиции и передвигая курсор сразу за последним сохранённым байтом. Курсор изначально находится в позиции 0 в начале данных. Тип может быть любым из следующих символов:
- a
- Хранит строку байтов длиной count в выходной строке. Каждый символ берется по модулю 256 (т.е. используется только младший байт каждого символа, а старший отбрасывается), поэтому при хранении строковых символов, полностью не выразимых с помощью символов \u0000-\u00ff, сначала следует использовать команду encoding convertto для изменения строки во внешнее представление, если такое усечение нежелательно (т.е. если символы не являются частью набора символов ISO 8859-1). Если arg содержит меньше, чем count байтов, то поле дополняется дополнительными нулевыми байтами. Если arg длиннее указанной длины, дополнительные символы будут проигнорированы. Если count равен *, то все байты в arg будут отформатированы. Если count опущено, то будет отформатирован один символ. Например,
binary format a7a*a alpha bravo charlie
вернёт строку, эквивалентную alpha\000\000bravoc,binary format a* [encoding convertto utf-8 \u20ac]
вернёт строку, эквивалентную \342\202\254 (что является последовательностью байтов UTF-8 для символа евро), иbinary format a* [encoding convertto iso8859-15 \u20ac]
вернёт строку, эквивалентную \244 (что является последовательностью байтов ISO 8859-15 для символа евро). Сравните эти последние два с:binary format a* \u20ac
, которая возвращает строку, эквивалентную \254 (т.е. \xac), усекая старшие биты символа, что, вероятно, не является желаемым результатом. - A
- Этот формат аналогичен a, за исключением того, что для заполнения используются пробелы вместо нулей. Например,
binary format A6A*A alpha bravo charlie
вернёт alpha bravoc. - b
- Хранит строку из count битов в порядке от младшего к старшему в каждом байте выходной строки. Arg должен содержать последовательность символов 1 и 0. Результирующие байты выводятся в порядке следования с битами, отформатированными от младшего к старшему в каждом байте. Если arg содержит меньше, чем count цифр, то для оставшихся битов используются нули. Если arg содержит больше, чем указанное количество цифр, дополнительные цифры будут проигнорированы. Если count равно *, то все цифры в arg будут отформатированы. Если count опущено, то будет отформатирована одна цифра. Если количество отформатированных битов не заканчивается на границе байта, оставшиеся биты последнего байта будут нулями. Например,
binary format b5b* 11100 111000011010
вернёт строку, эквивалентную \x07\x87\x05. - B
- Этот формат аналогичен b, за исключением того, что биты хранятся в порядке от старшего к младшему в каждом байте. Например,
binary format B5B* 11100 111000011010
вернёт строку, эквивалентную \xe0\xe1\xa0. - H
- Хранит строку из count шестнадцатеричных цифр в порядке от старшего к младшему в каждом байте выходной строки. Arg должен содержать последовательность символов из набора “0123456789abcdefABCDEF”. Результирующие байты выводятся в порядке следования с шестнадцатеричными цифрами, отформатированными в порядке от старшего к младшему в каждом байте. Если arg содержит меньше, чем count цифр, то для оставшихся цифр используются нули. Если arg содержит больше, чем указанное количество цифр, дополнительные цифры будут проигнорированы. Если count равно *, то все цифры в arg будут отформатированы. Если count опущено, то будет отформатирована одна цифра. Если количество отформатированных цифр не заканчивается на границе байта, оставшиеся биты последнего байта будут нулями. Например,
binary format H3H*H2 ab DEF 987
вернёт строку, эквивалентную \xab\x00\xde\xf0\x98. - h
- Этот формат аналогичен H, за исключением того, что цифры хранятся в порядке от младшего к старшему в каждом байте. Это редко требуется. Например,
binary format h3h*h2 AB def 987
вернёт строку, эквивалентную \xba\x00\xed\x0f\x89. - c
- Хранит одно или несколько 8-битных целых значений в выходной строке. Если count не указан, то arg должен состоять из целого значения. Если count указан, arg должен состоять из списка, содержащего не менее указанного количества целых чисел. Младшие 8 битов каждого целого числа хранятся как значение одного байта в позиции курсора. Если count равно *, то все целые числа в списке отформатируются. Если количество элементов в списке больше, чем count, то дополнительные элементы игнорируются. Например,
binary format c3cc* {3 -3 128 1} 260 {2 5}вернёт строку, эквивалентную \x03\xfd\x80\x04\x02\x05, в то время какbinary format c {2 5}сгенерирует ошибку. - s
- Этот формат аналогичен c, за исключением того, что он хранит одно или несколько 16-битных целых чисел в порядке little-endian в выходной строке. Младшие 16 битов каждого целого числа хранятся как значение двух байтов в позиции курсора, причём младший байт хранится первым. Например,
binary format s3 {3 -3 258 1}вернёт строку, эквивалентную \x03\x00\xfd\xff\x02\x01. - S
- Этот формат аналогичен s, за исключением того, что он хранит одно или несколько 16-битных целых чисел в порядке big-endian в выходной строке. Например,
binary format S3 {3 -3 258 1}вернёт строку, эквивалентную \x00\x03\xff\xfd\x01\x02. - t
- Этот формат (памятаю как *tiny*) аналогичен s и S, за исключением того, что он хранит 16-битные целые числа в выходной строке в порядке байтов по умолчанию машины, на которой выполняется сценарий Tcl. Чтобы определить порядок байтов машины, обратитесь к элементу byteOrder массива tcl_platform.
- i
- Этот формат аналогичен c, за исключением того, что он хранит одно или несколько 32-битных целых чисел в порядке little-endian в выходной строке. Младшие 32 бита каждого целого числа хранятся как значение четырёх байтов в позиции курсора, причём младший байт хранится первым. Например,
binary format i3 {3 -3 65536 1}вернёт строку, эквивалентную \x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x01\x00 - I
- Этот формат аналогичен i, за исключением того, что он хранит одно или несколько 32-битных целых чисел в порядке big-endian в выходной строке. Например,
binary format I3 {3 -3 65536 1}вернёт строку, эквивалентную \x00\x00\x00\x03\xff\xff\xff\xfd\x00\x01\x00\x00 - n
- Этот формат (памятаю как *number* или *normal*) аналогичен i и I, за исключением того, что он хранит 32-битные целые числа в выходной строке в порядке байтов по умолчанию машины, на которой выполняется сценарий Tcl. Чтобы определить порядок байтов машины, обратитесь к элементу byteOrder массива tcl_platform.
- w
- Этот формат аналогичен c, за исключением того, что он хранит одно или несколько 64-битных целых чисел в порядке little-endian в выходной строке. Младшие 64 бита каждого целого числа хранятся как значение восьми байтов в позиции курсора, причём младший байт хранится первым. Например,
binary format w 7810179016327718216
вернёт строку HelloTcl - W
- Этот формат аналогичен w, за исключением того, что он хранит одно или несколько 64-битных целых чисел в порядке big-endian в выходной строке. Например,
binary format Wc 4785469626960341345 110
вернёт строку BigEndian - m
- Этот формат (памятаю как зеркальное отражение w) аналогичен w и W, за исключением того, что он хранит 64-битные целые числа в выходной строке в порядке байтов по умолчанию машины, на которой выполняется сценарий Tcl. Чтобы определить порядок байтов машины, обратитесь к элементу byteOrder массива tcl_platform.
- f
- Этот формат аналогичен c, за исключением того, что он хранит одно или несколько одноточных чисел с плавающей точкой в представлении по умолчанию машины в выходной строке. Это представление не переносится между архитектурами, поэтому его не следует использовать для передачи чисел с плавающей точкой по сети. Размер числа с плавающей точкой может различаться между архитектурами, поэтому количество сгенерированных байтов может различаться. Если значение выходит за пределы представления по умолчанию машины, вместо него будет использовано значение FLT_MAX, определённое системой. Поскольку Tcl использует числа с плавающей точкой двойной точности в своём внутреннем представлении, при преобразовании в одноточное представление может произойти потеря точности. Например, на системе Windows, работающей на процессоре Intel Pentium,
binary format f2 {1.6 3.4}вернёт строку, эквивалентную \xcd\xcc\xcc\x3f\x9a\x99\x59\x40. - r
- Этот формат (памятаю как *real*) аналогичен f, за исключением того, что он хранит числа с плавающей точкой одинарной точности в порядке little-endian. Это преобразование даёт осмысленный результат только на машинах, которые используют представление чисел с плавающей точкой IEEE (очень распространённое, но не универсальное).
- R
- Этот формат аналогичен r, за исключением того, что он хранит числа с плавающей точкой одинарной точности в порядке big-endian.
- d
- Этот формат аналогичен f, за исключением того, что он хранит одно или несколько чисел с плавающей точкой двойной точности в представлении по умолчанию машины в выходной строке. Например, на системе Windows, работающей на процессоре Intel Pentium,
binary format d1 {1.6}вернёт строку, эквивалентную \x9a\x99\x99\x99\x99\x99\xf9\x3f. - q
- Этот формат (памятаю как зеркальное отражение d) аналогичен d, за исключением того, что он хранит числа с плавающей точкой двойной точности в порядке little-endian. Это преобразование даёт осмысленный результат только на машинах, которые используют представление чисел с плавающей точкой IEEE (очень распространённое, но не универсальное).
- Q
- Этот формат аналогичен q, за исключением того, что он хранит числа с плавающей точкой двойной точности в порядке big-endian.
- x
- Хранит count нулевых байтов в выходной строке. Если count не указан, хранится один нулевой байт. Если count равно *, генерируется ошибка. Этот тип не потребляет аргумент. Например,
binary format a3xa3x2a3 abc def ghi
вернёт строку, эквивалентную abc\000def\000\000ghi. - X
- Перемещает курсор назад на count байтов в выходной строке. Если count равно * или больше текущей позиции курсора, то курсор устанавливается в позицию 0, так что следующий хранимый байт будет первым байтом в результирующей строке. Если count опущено, то курсор перемещается назад на один байт. Этот тип не потребляет аргумент. Например,
binary format a3X*a3X2a3 abc def ghi
вернёт dghi. - @
- Перемещает курсор в абсолютную позицию в выходной строке, заданную count. Позиция 0 соответствует первому байту выходной строки. Если count ссылается на позицию за пределами последнего сохранённого байта, то в неинициализированные места будут помещены нулевые байты, а курсор будет помещён в указанную позицию. Если count равно *, то курсор перемещается к текущему концу выходной строки. Если count опущено, будет сгенерирована ошибка. Этот тип не потребляет аргумент. Например,
binary format a5@2a1@*a3@10a1 abcde f ghi j
вернёт abfdeghi\000\000j.
Двоичный поиск
The binary scan Команда анализирует поля из двоичной строки, возвращая количество выполненных преобразований. Строка предоставляет входные байты для анализа (по одному байту на символ, а символы, не представимые как байт, имеют обрезаны старшие биты), а форматСтроки указывает, как его анализировать. Каждое имяПеременной указывает имя переменной; при сканировании поля из строки результат присваивается соответствующей переменной.Как и в случае с двоичным форматом, форматСтроки состоит из последовательности нуля или более спецификаторов полей, разделенных нулем или более пробелами. Каждый спецификатор поля представляет собой один символ типа, за которым следует необязательный символ флага и необязательное числовое количество. Большинство спецификаторов полей потребляют один аргумент, чтобы получить переменную, в которую должны быть помещены отсканированные значения. Символ типа указывает, как двоичные данные должны интерпретироваться. Количество обычно указывает, сколько элементов указанного типа берётся из данных. Если указано, количество — это целое положительное десятичное число или *, что обычно указывает на то, что должны быть использованы все оставшиеся элементы в данных. Если после текущей позиции курсора не хватает байтов для удовлетворения текущего спецификатора поля, то соответствующая переменная остается без изменений, и двоичный поиск немедленно возвращает количество переменных, которые были установлены. Если недостаточно аргументов для всех полей в строке формата, которые потребляют аргументы, то генерируется ошибка. Символ флага “u” может быть указан, чтобы заставить некоторые типы считываться как беззнаковые значения. Флаг принимается для всех типов полей, но игнорируется для полей, не являющихся целыми числами.
Аналогичный пример, как и с двоичным форматом, должен объяснить взаимосвязь между спецификаторами полей и аргументами в случае подкоманды двоичного поиска:
binary scan $bytes s3s first second
Эта команда (при условии, что двоичная строка в переменной байты достаточно длинная) присваивает список из трех целых чисел переменной первый и присваивает одно значение переменной второй. Если байты содержат меньше 8 байтов (т.е. четыре 2-байтовых целых числа), присваивание второму не будет выполнено, а если байты содержат меньше 6 байтов (т.е. три 2-байтовых целых числа), присваивание первому не будет выполнено. Следовательно:
puts [binary scan abcdefg s3s first second] puts $first puts $secondбудет выводить (предполагая, что ни одна переменная не установлена ранее):
1 25185 25699 26213 can't read "second": no such variable
Важно отметить, что c, s и S (и i и I на 64-битных системах) будут сканироваться в значениях длины данных типа long. При этом значения, у которых установлен старший бит (0x80 для символов, 0x8000 для коротких целых чисел, 0x80000000 для целых чисел), будут расширяться со знаком. Таким образом, произойдет следующее:
set signShort [binary format s1 0x8000] binary scan $signShort s1 val; # val == 0xFFFF8000Если вам нужны беззнаковые значения, вы можете включить символ флага “u” после типа поля. Например, чтобы прочитать беззнаковое короткое целое число:
set signShort [binary format s1 0x8000] binary scan $signShort su1 val; # val == 0x00008000
Каждая пара тип-количество перемещает воображаемый курсор по двоичным данным, читая байты с текущей позиции. Курсор первоначально находится в позиции 0 в начале данных. Тип может быть любым из следующих символов:
- a
- Данные представляют собой строку байтов длиной count. Если count равно *, то все оставшиеся байты в string будут считаны в переменную. Если count опущено, то будет считано один байт. Все считанные байты будут интерпретированы как символы в диапазоне \u0000-\u00ff, поэтому команда encoding convertfrom потребуется, если строка не является бинарной строкой или строкой, закодированной в ISO 8859-1. Например,
binary scan abcde\000fghi a6a10 var1 var2
вернёт 1, при этом строка, эквивалентная abcde\000, будет сохранена в var1, а var2 останется неизменной, иbinary scan \342\202\254 a* var1 set var2 [encoding convertfrom utf-8 $var1]
сохранит символ евро в var2. - A
- Этот формат аналогичен a, за исключением того, что хвостовые пробелы и нули удаляются из сканированного значения перед сохранением в переменной. Например,
binary scan "abc efghi \000" A* var1
вернёт 1, при этом abc efghi будет сохранено в var1. - b
- Данные преобразуются в строку из count бинарных цифр в порядке от младшего к старшему, представленных последовательностью символов «1» и «0». Байты данных сканируются в порядке от первого к последнему, при этом биты берутся от младшего к старшему в каждом байте. Любые дополнительные биты в последнем байте игнорируются. Если count равно *, то все оставшиеся биты в string будут считаны. Если count опущено, то будет прочитан один бит. Например,
binary scan \x07\x87\x05 b5b* var1 var2
вернёт 2, при этом 11100 будет сохранено в var1, а 1110000110100000 — в var2. - B
- Этот формат аналогичен b, за исключением того, что биты берутся в порядке от старшего к младшему в каждом байте. Например,
binary scan \x70\x87\x05 B5B* var1 var2
вернёт 2, при этом 01110 будет сохранено в var1, а 1000011100000101 — в var2. - H
- Данные преобразуются в строку из count шестнадцатеричных цифр в порядке от старшего к младшему, представленных последовательностью символов из набора «0123456789abcdef». Байты данных сканируются в порядке от первого к последнему, при этом шестнадцатеричные цифры берутся от старшего к младшему в каждом байте. Любые дополнительные биты в последнем байте игнорируются. Если count равно *, то все оставшиеся шестнадцатеричные цифры в string будут считаны. Если count опущено, то будет прочитана одна шестнадцатеричная цифра. Например,
binary scan \x07\xC6\x05\x1f\x34 H3H* var1 var2
вернёт 2, при этом 07c будет сохранено в var1, а 051f34 — в var2. - h
- Этот формат аналогичен H, за исключением того, что цифры берутся в обратном порядке (от младшего к старшему) в каждом байте. Например,
binary scan \x07\x86\x05\x12\x34 h3h* var1 var2
вернёт 2, при этом 706 будет сохранено в var1, а 502143 — в var2.Обратите внимание, что большинство кодов, которые желают парсить шестнадцатеричные цифры из нескольких байтов в нужном порядке, должны использовать формат H.
- c
- Данные преобразуются в count 8-битных знакомых целых чисел и сохраняются в соответствующей переменной в виде списка. Если count равно *, то все оставшиеся байты в string будут считаны. Если count опущено, то будет считано одно 8-битное целое число. Например,
binary scan \x07\x86\x05 c2c* var1 var2
вернёт 2, при этом 7 -122 будет сохранено в var1, а 5 — в var2. Обратите внимание, что возвращаемые целые числа знакомые, но их можно преобразовать в беззнаковые 8-битные значения, используя выражение, подобное:set num [expr { $num & 0xff }] - s
- Данные интерпретируются как count 16-битных знакомых целых чисел, представленных в little-endian порядке байтов. Целые числа сохраняются в соответствующей переменной в виде списка. Если count равно *, то все оставшиеся байты в string будут считаны. Если count опущено, то будет считано одно 16-битное целое число. Например,
binary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2
вернёт 2, при этом 5 7 будет сохранено в var1, а -16 — в var2. Обратите внимание, что возвращаемые целые числа знакомые, но их можно преобразовать в беззнаковые 16-битные значения, используя выражение, подобное:set num [expr { $num & 0xffff }] - S
- Этот формат аналогичен s, за исключением того, что данные интерпретируются как count 16-битных знакомых целых чисел, представленных в big-endian порядке байтов. Например,
binary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2
вернёт 2, при этом 5 7 будет сохранено в var1, а -16 — в var2. - t
- Данные интерпретируются как count 16-битных знакомых целых чисел, представленных в родном порядке байтов машины, на которой выполняется сценарий Tcl. В остальном он идентичен s и S. Чтобы определить родной порядок байтов машины, обратитесь к элементу byteOrder массива tcl_platform.
- i
- Данные интерпретируются как count 32-битных знакомых целых чисел, представленных в little-endian порядке байтов. Целые числа сохраняются в соответствующей переменной в виде списка. Если count равно *, то все оставшиеся байты в string будут считаны. Если count опущено, то будет считано одно 32-битное целое число. Например,
set str \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff binary scan $str i2i* var1 var2
вернёт 2, при этом 5 7 будет сохранено в var1, а -16 — в var2. Обратите внимание, что возвращаемые целые числа знакомые, но их можно преобразовать в беззнаковые 32-битные значения, используя выражение, подобное:set num [expr { $num & 0xffffffff }] - I
- Этот формат аналогичен I, за исключением того, что данные интерпретируются как count 32-битных знакомых целых чисел, представленных в big-endian порядке байтов. Например,
set str \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 binary scan $str I2I* var1 var2
вернёт 2, при этом 5 7 будет сохранено в var1, а -16 — в var2. - n
- Данные интерпретируются как count 32-битных знакомых целых чисел, представленных в родном порядке байтов машины, на которой выполняется сценарий Tcl. В остальном он идентичен i и I. Чтобы определить родной порядок байтов машины, обратитесь к элементу byteOrder массива tcl_platform.
- w
- Данные интерпретируются как count 64-битных знакомых целых чисел, представленных в little-endian порядке байтов. Целые числа сохраняются в соответствующей переменной в виде списка. Если count равно *, то все оставшиеся байты в string будут считаны. Если count опущено, то будет считано одно 64-битное целое число. Например,
set str \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff binary scan $str wi* var1 var2
вернёт 2, при этом 30064771077 будет сохранено в var1, а -16 — в var2. Обратите внимание, что возвращаемые целые числа знакомые и не могут быть представлены в Tcl как беззнаковые значения. - W
- Этот формат аналогичен w, за исключением того, что данные интерпретируются как count 64-битных знакомых целых чисел, представленных в big-endian порядке байтов. Например,
set str \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 binary scan $str WI* var1 var2
вернёт 2, при этом 21474836487 будет сохранено в var1, а -16 — в var2. - m
- Данные интерпретируются как count 64-битных знакомых целых чисел, представленных в родном порядке байтов машины, на которой выполняется сценарий Tcl. В остальном он идентичен w и W. Чтобы определить родной порядок байтов машины, обратитесь к элементу byteOrder массива tcl_platform.
- f
- Данные интерпретируются как count однобайтовых чисел с плавающей точкой в родном представлении машины. Числа с плавающей точкой сохраняются в соответствующей переменной в виде списка. Если count равно *, то все оставшиеся байты в string будут считаны. Если count опущено, то будет считано одно однобайтовое число с плавающей точкой. Размер числа с плавающей точкой может отличаться в различных архитектурах, поэтому количество считываемых байтов может отличаться. Если данные не представляют собой действительное число с плавающей точкой, результат неопределён и зависит от компилятора. Например, на системе Windows, работающей на процессоре Intel Pentium,
binary scan \x3f\xcc\xcc\xcd f var1
вернёт 1, при этом 1.6000000238418579 будет сохранено в var1. - r
- Этот формат аналогичен f, за исключением того, что данные интерпретируются как count однобайтовых чисел с плавающей точкой в little-endian порядке. Это преобразование не является переносимым на меньшинство систем, не использующих представление чисел с плавающей точкой IEEE.
- R
- Этот формат аналогичен f, за исключением того, что данные интерпретируются как count однобайтовых чисел с плавающей точкой в big-endian порядке. Это преобразование не является переносимым на меньшинство систем, не использующих представление чисел с плавающей точкой IEEE.
- d
- Этот формат аналогичен f, за исключением того, что данные интерпретируются как count чисел с двойной точностью с плавающей точкой в родном представлении машины. Например, на системе Windows, работающей на процессоре Intel Pentium,
binary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1
вернёт 1, при этом 1.6000000000000001 будет сохранено в var1. - q
- Этот формат аналогичен d, за исключением того, что данные интерпретируются как count чисел с двойной точностью с плавающей точкой в little-endian порядке. Это преобразование не является переносимым на меньшинство систем, не использующих представление чисел с плавающей точкой IEEE.
- Q
- Этот формат аналогичен d, за исключением того, что данные интерпретируются как count чисел с двойной точностью с плавающей точкой в big-endian порядке. Это преобразование не является переносимым на меньшинство систем, не использующих представление чисел с плавающей точкой IEEE.
- x
- Перемещает курсор вперёд на count байтов в string. Если count равно * или больше, чем количество байтов после текущей позиции курсора, то курсор устанавливается после последнего байта в string. Если count опущено, то курсор перемещается вперёд на один байт. Обратите внимание, что этот тип не потребляет аргумент. Например,
binary scan \x01\x02\x03\x04 x2H* var1
вернёт 1, при этом 0304 будет сохранено в var1. - X
- Перемещает курсор назад на count байтов в string. Если count равно * или больше, чем текущая позиция курсора, то курсор устанавливается в позицию 0, так что следующий считываемый байт будет первым байтом в string. Если count опущено, то курсор перемещается назад на один байт. Обратите внимание, что этот тип не потребляет аргумент. Например,
binary scan \x01\x02\x03\x04 c2XH* var1 var2
вернёт 2, при этом 1 2 будет сохранено в var1, а 020304 — в var2. - @
- Перемещает курсор в абсолютную позицию в строке данных, указанную count. Обратите внимание, что позиция 0 соответствует первому байту в string. Если count ссылается на позицию за пределами конца string, то курсор устанавливается после последнего байта. Если count опущено, будет сгенерирована ошибка. Например,
binary scan \x01\x02\x03\x04 c2@1H* var1 var2
вернёт 2, при этом 1 2 будет сохранено в var1, а 020304 — в var2.
Проблемы переносимости
Форматы r, R, q и Q преобразования будут работать надежно только при передаче данных между компьютерами, которые все используют представления чисел с плавающей точкой IEEE. Это очень распространённо, но не универсально. Для переноса чисел с плавающей точкой между всеми архитектурами используйте их текстовое представление (как создается функцией format) вместо этого.Примеры
Это процедура записи строки Tcl в двоичный закодированный канал как данные UTF-8, предваряемые словом длины:proc writeString {channel string} {
set data [encoding convertto utf-8 $string]
puts -nonewline [binary format Ia* \
[string length $data] $data]
} Эта процедура считывает строку из канала, записанную ранее представленной процедурой writeString:
proc readString {channel} {
if {![binary scan [read $channel 4] I length]} {
error "missing length"
}
set data [read $channel $length]
return [encoding convertfrom utf-8 $data]
} Это преобразует содержимое файла (названного в переменной filename) в base64 и выводит его:
set f [open $filename rb] set data [read $f] close $f puts [binary encode base64 -maxlen 64 $data]
См. также
encoding, format, scan, string, tcl_platform
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/binary.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/binary.htm