Встроенные команды ТCL


Binary

        Команда вставляет и извлекает поля из двоичных строк.

        Синтаксис
        binary format formatString?arg arg...?

        binary scan string formatString?varName varName...?

        Описание
        Команда binary предоставляет средства для манипулирования двоичными данными. Первая из форм команды конвертирует обычные Tcl-значения arg в двоичное число. Например, вызванная с аргументами 16 и 22, она вернет 8-байтовую двоичную строку, состоящую из двух 4-байтовых чисел, представляющих соответственно 16 и 22. Вторая форма команды выполняет обратное действие, она извлекает из двоичной строки данные и возвращает их как обычные Tсl строки.

binary format
        Команда binary format создает двоичную строку по правилам, заданным с помощью шаблона formatString. Содержание этой строки задается дополнительными аргументами arg. Команда возвращает сформированную двоичную строку.

        Шаблон formatString содержит последовательность из нуля или более спецификаторов преобразования, разделенных одним или более пробелами. Каждый спецификатор преобразования состоит из буквы, за которой может следовать число count. Как правило, спецификатор использует один из аргументов arg, чтобы получить величину для форматирования. Буква в спецификаторе указывает тип преобразования (форматирования). Число count обычно указывает, сколько объектов для форматирования выбирается из значения arg. Соответственно, count должно быть неотрицательным десятичным числом. Если значение count равно «*», это обычно указывает, что надо использовать все значение аргумента. Если число аргументов arg не соответствует числу спецификаторов, требующих для себя дополнительного аргумента, выдается ошибка.

        Обычно результат каждого нового преобразования дописывается в конец возвращаемой строки. Однако с помощью специальных спецификаторов точку ввода нового значения (курсор) можно передвигать по формируемой строке.

        Ниже приведены допустимые значения спецификаторов преобразований и описаны соответствующие преобразования.         

  • a?count?

  •         Передает в выходную строку count символов из соответствующего аргумента arg. Если в arg содержится меньше count байт, добавляются нулевые байты. Если в arg содержится больше count байт, «лишние» байты игнорируются. Если count равно «*», используются все байты из arg. Если count отсутствует, используется один байт. Например, команда:

            binary format а7а*а alpha bravo Charlie

    вернет строку, эквивалентную alpha\000\000bravoc.         

  • A?count?

  •         То же, что и а, за исключением того, что для заполнения используются не нулевые байты, а пробелы. Например, команда:

            binary format А6А*A alpha bravo charlie

    вернет alpha bravoc.         

  • b?count?

  •         Передает в выходную строку count бит в порядке от младших к старшим в каждом байте. Apryмент arg должен состоять из последовательности нулей и единиц. Порядок байтов в выходной строке тот же, что и во входной информации. Лишние биты отсекаются, недостающие дополняются нулями. По умолчанию форматируется один бит. Если число форматируемых битов не соответствует целому числу байтов, недостающие биты дополняются нулями. Например, команда:

            binary format b5b* 11100 111000011010

    вернет строку, эквивалентную \x07\x87\x05.         

  • B?count?

  •         Тоже, что и b, но биты выдаются в порядке от старших к младшим. Например, команда:

            binary format В5В* 11100 111000011010

    вернет строку, эквивалентную \xe0\xel\xa0.         

  • h?count?

  •         Передает в выходную строку count шестнадцатеричных чисел в порядке от младших к старшим в каждом байте. Аргумент arg должен состоять из последовательности символов, содержащихся в множестве: «0123456789abcdefABCDEF». Порядок байтов в выходной строке тот же, что и во входной информации. Лишние символы отсекаются, недостающие дополняются нулями. По умолчанию форматируется одно шестнадцатеричное число. Если число форматируемых чисел не соответствует целому числу байтов, недостающие биты дополняются нулями.

            Например, команда:

            binary format h3h* АВ def

    вернет строку, эквивалентную \xba\xed\x0f.         

  • H?count?

  •         Тоже, что и h, но биты выдаются в порядке от старших к младшим. Например, команда:

            binary format НЗН* ab DEF

    вернет строку, эквивалентную \xab\xde\xf0.         

  • c?count?

  •         Передает в выходную строку одно или несколько восьмибитных чисел. Если count не указан, аргумент arg должен состоять из одного целого числа. В противном случае он должен состоять из списка, содержащего не менее count целых чисел. Последние 8 бит каждого числа сохраняются как один байт в выходной строке. Если count равно «*», форматируются все числа в списке. Если в списке меньше чисел, чем count, выдается ошибка. Лишние числа в списке игнорируются. Например, команда:

            binary format сЗсс* {3 -3 128 1} 257 {2 5}

    вернет строку, эквивалентную \x03\xfd\x80\x01\x02\x05, тогда как команда:

            binary format с {2 5}

    вернет ошибку.         

  • s?count?

  •         Эта форма аналогична с, за исключением того, что она сохраняет 16-ти битовые числа. Последние шестнадцать бит числа сохраняются как два байта, последний байт первым. Например, команда:

            binary format s3 {3 -3 258 1}

    вернет строку, эквивалентную \x03\x00\xfd\xff\x02\x01.         

  • S?count?

  •         Эта форма аналогична s, за исключением того, что порядок байтов противоположный. Например, команда:

            binary format S3 {3 -3 258 1}

    вернет строку, эквивалентную \x00\x03\xff\xfd\x01\x02.         

  • i?count?

  •         Эта форма аналогична с, за исключением того, что она сохраняет 32-х разрядные числа. Например, команда:

            binary format i3 {3 -3 65536 1}

    вернет строку, эквивалентную \x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x10\х00.         

  • I?count?

  •         Эта форма отличается от i порядком байтов в числе. Например, команда:

            binary format 13 (3 -3 65536 1}

    вернет строку, эквивалентную \x00\x00\x00\x03\xff\xfl\xff\xfd\x00\x 10\х00\х00.         

  • f?count?

  •         Эта форма аналогична с, за исключением того, что она сохраняет числа с плавающей запятой в машинном представлении (используемом для конкретной платформы). Например, на Windows платформе с процессором Pentium команда:

            binary format f2 {1.6 3.4}

    вернет строку, эквивалентную \xcd\xcc\xcc\x3f\x9a\x99\x59\x40.         

  • d?count?

  •         Эта форма аналогична f, за исключением того, что используется представление для десятичных чисел с двойной точностью. Например, на Windows платформе с процессором Pentium команда:

            binary format d1 {1.6}

    вернет строку, эквивалентную \x9a\x99\x99\x99\x99\x99\xf9\x3f.         

  • x?count?

  •         Записывает в выходную строку count нулевых байтов. Если count не задан, записывает один нулевой байт. Если count равно «*», выдает ошибку. Ни один из аргументов arg при форматировании не используется. Например, команда:

            binary format аЗхаЗх2аЗ abc def ghi

    вернет строку, эквивалентную abc\000def\000\000ghi.         

  • X?count?

  •         Передвигает место будущей вставки в выходную строку (курсор) на count байтов назад. Если аргумент count равен «*» или больше текущей позиции, передвигает курсор на начало строки. Если count не указан, передвигает его на один байт. Ни один из аргументов arg при форматировании не используется. Например, команда:

            binary format аЗХ*аЗХ2аЗ abc def ghi

    вернет dghi.         

  • @ ?count?

  •         Передвигает место будущей вставки в выходную строку (курсор) на абсолютную позицию count. Позиция 0 соответствует первому байту в строке. Если count больше текущей длины строки, она дополняется до необходимой позиции нулевыми байтами. «*» указывает на конец строки. Если аргумент count не указан, команда возвращает ошибку. Ни один из аргументов arg при форматировании не используется. Например, команда:

            binary format a5@2a1@*a3@10a1 abcde f ghi j

    вернет abfdeghi\000\000j.
            
    binary scan
            Команда binary scan просматривает двоичную строку string, возвращая число выполненных преобразований. Строка formatString содержит последовательность спецификаторов преобразования. Каждый из аргументов varName содержит имя переменной, в которую записывается результат очередного преобразования.

            Поскольку спецификаторы преобразований строятся по тем же правилам, что и для binary format, ниже приведены примеры их использования с минимальными пояснениями. Принципиальным моментом при исполнении команды binary scan является то, что если для очередного преобразования, указанного в formatString, требуется больше байтов, чем осталось до конца строки, то команда немедленно завершается, а соответствующая переменная (в которую должен был записываться результат преобразования) остается ней неизменной. Если для записи результата очередного преобразования не осталось переменной, команда возвращает ошибку.         

  • a?count?

  •         Команда:

            binary scan abcde\000fghi а6а10 var1 var2

    вернет значение 1. В переменной var1 будет записана строка abcde\000, а переменная var2 не изменится.
            
  • A?count?

  •         Команда

            binary scan "abc efghi\000" a* var1

    вернет 1. В переменной var1 будет записана строка abc efghi.         

  • b?count?

  •         Команда

            binary scan\x07\x87\x05 b5b* var1 var2

    вернет 2. В переменной var1 будет записано 11100, в переменной var2 будет записано 1110000110100000.         

  • B?count?

  •         Команда

            binary scan\x70\x87\x05 Ь5Ь* var1 var2

    вернет 2. В переменной var1 будет записано 01110. В переменной var2 1000011100000101.         

  • h?count?

  •         Команда

            binary scan\x07\x86\x05 h3h* var1 var2

    вернет 2. В переменной var1 будет записано 706. В переменной var250.         

  • H?count?

  •         Команда

            binary scan\x07\x86\x05 НЗН* var1 var2

    вернет 2. В переменной var1 будет записано 078. В переменной var205.
            
  • c?count?

  •         Команда

            binary scan\x07\x86\x05 c2c* var1 var2

    вернет 2. В переменной var1 будет записана строка 7 -122. В переменной var2 — 5. Обратите внимание, что команда возвращает числа со знаком. Чтобы преобразовать их в числа без знака можно использовать выражение:

            expr ( $num + 0x100 ) % 0x100         

  • s?count?

  •         Команда

            binary scan\x05\x00\x07\x00\xf0\xff s2s* var1 var2

    вернет 2. В переменной var1 будет записана строка 5 7. В переменной var2-16. Обратите внимание, что команда возвращает числа со знаком. Чтобы преобразовать их в числа без знака можно использовать выражение:

            expr ( $num + 0x10000 ) % 0x10000         

  • S?count?

  •         Команда

            binary Scan\x00\x05\x00\x07\xff\xf0 S2S* var1 var2

    вернет 2. В переменной var1 будет записана строка 5 7. В переменной var2-16.         

  • i?count?

  •         Команда

            binary scan\x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff i2i* varl var2

    вернет 2. В переменной var1 будет записана строка 5 7. В переменной var2- -16. Обратите внимание, что команда возвращает числа со знаком. В Tcl нет возможности перевести его в число без знака.         

  • I?count?

  •         Команда

            binary\x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2

    вернет 2. В переменной var1 будет записана строка 5 7. В переменной var2-16.         

  • f?coimt?

  •         На Windows платформе с процессором Pentium команда

            binary scan\x3f\xcc\xcc\xcd f var1

    вернет 1. В переменной var1 будет записано 1.6000000238418579.         

  • d?count?

  •         На Windows платформе с процессором Pentium команда

            binary scan\x9a\x99\x99\x99\x99\x99\xf9\x3f d var1

    вернет 1. В переменной var1 будет записано 1.6000000000000001.         

  • x?count?

  •         Команда

            binary scan\x01\x02\x03\x04 х2Н* var1

    вернет 1. В переменной var1 будет 0304. Преобразование не требует дополнительной переменной varName.         

  • X?count?

  •         Команда

            binary scan\x01\x02\x03\x04 с2ХН* var1 var2

    вернет 2. В переменной var1 будет 1 2. В переменной var2020304. Преобразование не требует дополнительной переменной varName.         

  • @?count?

  •         Команда

            binary scan\x01\x02\x03\x04 с2@1Н* var1 var2

    вернет 2. В переменной var1 будет 1 2. В переменной var2020304. Преобразование не требует дополнительной переменной varName.
    Hosted by uCoz