8-900-374-94-44
[email protected]
Slide Image
Меню

Тип byte в паскале: byte/ru — Free Pascal wiki

Целые типы

Список предопределенных целочисленных типов представлен в таблице (3.1).


Таблица 3.1: Предопределенные целочисленные типы

Имя

Integer

ShortInt

SmallInt

LongInt

LongWord

Int64

Byte

Word

Cardinal

QWord

Boolean

ByteBool

WordBool

LongBool

Char


Целочисленные типы, и их диапазоны и размеры, предопределены во Free Pascal, и перечислены в таблице (3.2). Пожалуйста, отметьте, что типы QWord и Int64 не истинно перечисляемые, таким образом, некоторые конструкции языка Pascal не будут работать с этими двумя целочисленными типами.


Таблица 3.2: Предопределенные целочисленные типы

Тип

Диапазон

Размер в байтах

Byte

0 .. 255

1

ShortInt

-128 .. 127

1

SmallInt

-32768 .. 32767

2

Word

0 .. 65535

2

Integer

или SmallInt или LongInt

2 или 4

Cardinal

LongWord

4

LongInt

-2147483648 .. 2147483647

4

LongWord

0 .. 4294967295

4

Int64

-9223372036854775808 .. 9223372036854775807

8

QWord

0 .. 18446744073709551615

8


По умолчанию во Free Pascal тип Integer соответствует типу SmallInt. И типу LongInt в любом из двух режимов Delphi или ObjFPC. Тип Cardinal сейчас всегда соответствует типу LongWord.

Замечание:

Все десятичные константы, которые не входят в диапазон -2147483648  .. 2147483647 начиная с версии 1.9.0, автоматически обрабатываются как 64-разрядные целые константы. Более ранние версии будут конвертировать их в вещественные типизированные константы.

Free Pascal делает автоматическое преобразование типов в выражениях, где используются различные виды целочисленных типов:

1.Каждая платформа имеет родной размер целого числа, в зависимости от того, платформа 8-бит, 16-бит, 32-бит или 64-бит. например, на AVR это 8-разрядная платформа.

2.Каждое целое число меньшее, родного размера повышается до базовой версии родного размера. Целые равные родному размеру сохраняют их разрядность.

3.Результат двоичных арифметических операций (+, –, * и т.д.), определяется следующим образом:

a.Если по крайней мере один из операндов больше, чем нативный (родной) размер целого, то результатом выбирается наименьший тип, который охватывает диапазон типов обоих операндов. Это означает, что смешивание типа без знака с меньшим или равным по размеру знакового типа, даст тип, который больше, чем оба из них.

b.Если оба операнда имеют один и тот же тип (размер), то результатом будет такой-же тип. Единственным исключением является вычитание (–): если один из типов без знаковой, операция вычитания даёт знаковый тип FPC (как и в Delphi, но не в TP7 ).

c.Смешивние знаковых и беззнаковых типов родного целого типа — даёт тип, больший по размеру, и со знаком. Это означает, что при смешивании типов LongInt и LongWord на 32-разрядных платформах будет производить Int64. Аналогично, при смешивании типа Byte и ShortInt на 8-разрядных платформах (AVR ), результатом будет тип SmallInt.

Программирование на языке Pascal — тест 2

Главная / Программирование / Программирование на языке Pascal / Тест 2

Упражнение 1:


Номер 1

Тип данных real является

Ответ:

&nbsp(1) арифметическим&nbsp

&nbsp(2) базовым&nbsp

&nbsp(3) конструируемым&nbsp

&nbsp(4) порядковым &nbsp

&nbsp(5) структурированным &nbsp



Номер 2

Тип данных integer
является

Ответ:

&nbsp(1) арифметическим&nbsp

&nbsp(2) базовым&nbsp

&nbsp(3) конструируемым&nbsp

&nbsp(4) порядковым &nbsp

&nbsp(5) структурированным &nbsp



Номер 3

Тип данных boolean является

Ответ:

&nbsp(1) арифметическим&nbsp

&nbsp(2) базовым&nbsp

&nbsp(3) конструируемым&nbsp

&nbsp(4) структурированным &nbsp



Упражнение 2:


Номер 1

Типы данных byte и shortint являются:

Ответ:

&nbsp(1) эквивалентными&nbsp

&nbsp(2) совместимыми&nbsp

&nbsp(3) совместимыми по присваиванию&nbsp



Номер 2

Типы данных double и real являются:

Ответ:

&nbsp(1) эквивалентными&nbsp

&nbsp(2) совместимыми&nbsp

&nbsp(3) совместимыми по присваиванию&nbsp



Номер 3

Типы данных real и integer являются:

Ответ:

&nbsp(1) эквивалентными&nbsp

&nbsp(2) несовместимыми&nbsp

&nbsp(3) совместимыми по присваиванию&nbsp



Упражнение 3:


Номер 1

Какой тип будет иметь результат выражения a+b при a:word, b:integer?

Ответ:

&nbsp(1) byte&nbsp

&nbsp(2) word&nbsp

&nbsp(3) shortint&nbsp

&nbsp(4) integer&nbsp

&nbsp(5) longint&nbsp



Номер 2

Какой тип будет иметь результат выражения a+b при a:byte, b:shortint?

Ответ:

&nbsp(1) byte&nbsp

&nbsp(2) word&nbsp

&nbsp(3) shortint&nbsp

&nbsp(4) integer&nbsp

&nbsp(5) longint&nbsp



Номер 3

Какой тип будет иметь результат выражения a+b при a:shortint, b:word?

Ответ:

&nbsp(1) byte&nbsp

&nbsp(2) word&nbsp

&nbsp(3) shortint&nbsp

&nbsp(4) integer&nbsp

&nbsp(5) longint&nbsp



Упражнение 4:


Номер 1

Какие из вариантов расстановки скобок в выражении
        a and b shr c mod a + c * a shl - b div a
        не меняют порядок выполнения операций?

Ответ:

&nbsp(1) (((a and b)shr c)mod a)+(c*((a shl(-b))div a))&nbsp

&nbsp(2) a and b shr c mod a +(((c*a)shl(-b))div a)&nbsp

&nbsp(3) ((a and b)shr c)mod a+c*(a shl -b div a)&nbsp

&nbsp(4) (a and(b shr(c mod a)))+(c*(a shl(-(b div a))))&nbsp

&nbsp(5) a and b shr c mod a+(c*(a shl((-b)div a)))&nbsp

&nbsp(6) a and b shr c mod a+((c*a) shl(-(b div a)))&nbsp



Номер 2

Какой из вариантов расстановки скобок в выражении
        a + b or c shl a * c - a mod b > a 
        не меняет порядок выполнения операций?

Ответ:

&nbsp(1) a+(((b or c)shl a)*c)-(a mod b)>a&nbsp

&nbsp(2) a+(b or((c shl a)*c))-a mod(b>a)&nbsp

&nbsp(3) a+(b or((c shl a)*c))-(a mod b)>a&nbsp

&nbsp(4) (a+b or c shl a*c-a mod b)>a&nbsp

&nbsp(5) (a+b or c shl a*c(-a)mod b)>a&nbsp



Номер 3

Какие из вариантов расстановки скобок в выражении
        a * b + not c > a mod c * a shl b xor a 
        не меняют порядок выполнения операций?

Ответ:

&nbsp(1) a*b+(not c)>(((a mod c)*a)shl b)xor a&nbsp

&nbsp(2) a*b+(not c)>(a mod((c*a)shl b))xor a&nbsp

&nbsp(3) ((((a*(b+not c)>a)mod c)*a)shl b)xor a&nbsp

&nbsp(4) (a*b+not c)>(a mod c*a shl b)xor a&nbsp

&nbsp(5) (a*b)+(not c)>(a mod c)*(a shl b)xor a&nbsp

&nbsp(6) (a*b)+(not c)>(a mod (c*(a shl(b xor a))))&nbsp



Главная / Программирование / Программирование на языке Pascal / Тест 2

ТИП ДАННЫХ SIMPLE PASCAL

ЧТО ТАКОЕ ТИП ДАННЫХ?

Тип в Паскале и некоторых других популярных языках программирования определяет переменную таким образом, что он определяет диапазон значений, которые может хранить переменная, а также определяет набор операций, которые допустимы для выполняться над переменными этого типа. TURBO Pascal имеет восемь основных типов данных, которые предопределены и могут использоваться в любом месте программы при условии, что вы используете их правильно. Эта глава посвящена иллюстрации использования этих восьми типов данных путем определения допустимого диапазона значений, которые могут быть им присвоены, и иллюстрации операций, которые можно выполнять с переменными этих типов. Далее следует восемь типов и очень краткое описание;

 integer Целые числа от -32768 до 32767 
byte Целые числа от 0 до 255
real Числа с плавающей запятой от 1E-38 до 1E+38
boolean Может иметь только значение TRUE или FALSE
char Любой символ из набора символов ASCII
shortint Целые числа от -128 до 127
word Целые числа от 0 до 65535
longint Целые числа от -2147483648 до 2147483647

Обратите внимание, что четыре из этих типов данных (char, shortint, word и longint) не являются часть стандартного определения Pascal, но включены в качестве расширений компилятора TURBO Pascal.

В дополнение к указанным выше типам данных в TURBO Pascal версии 5.0 и выше доступны следующие типы данных;

 single Тип Real с 7 значащими цифрами 
double Тип Real с 15 значащими цифрами
расширенный тип Real с 19 значащими цифрами
comp Целые числа примерно от -10E18 до 10E18 использовать математический сопроцессор 80X87. Поскольку TURBO Pascal имеет программный эмулятор для операций с плавающей запятой, математический сопроцессор 80X87 не обязательно требуется для использования этих новых типов в этих версиях. Конечно, полученная программа будет работать намного быстрее, если у вас есть сопроцессор, доступный для использования программой. Обратите внимание, что математический сопроцессор встроен в каждый процессор 80486 и Pentium.

Полное определение доступных типов для каждого компилятора можно найти в справочном руководстве по TURBO Pascal. Было бы хорошо прочитать эти страницы сейчас для хорошего определения, прежде чем научиться определять и использовать их в программе. Обратите внимание, что все они будут использоваться в примерах программ в этой главе.

НАШИ ПЕРВЫЕ ПЕРЕМЕННЫЕ

Пример программы ------> INTVAR.PAS

Целые числа намного легче понять, поэтому мы начнем с простой программы, которая использует некоторые целые числа в очень простом способ. Загрузите INTVAR.PAS в свою систему Pascal и давайте взглянем на нее.

Сразу за оператором программы следует еще одно зарезервированное слово, var . Это зарезервированное слово используется для определения переменной, прежде чем ее можно будет использовать в любом месте программы. Существует нерушимое правило Паскаля, которое гласит: «Ничто нельзя использовать, пока оно не определено». Компилятор будет жаловаться, указывая на ошибку компиляции, если вы попытаетесь использовать переменную без ее правильного определения. Кажется немного хлопотным определять каждую переменную до ее использования, но это правило отловит многие орфографические ошибки переменных до того, как они вызовут проблемы. Некоторые другие языки просто определяют новую переменную с новым именем и весело продолжают свой путь, создавая для вас хорошо отформатированный мусор.

Обратите внимание, что зарезервированное слово var используется только один раз, но оно используется для определения трех разных переменных: Count , X и Y . Как только слово var распознано, компилятор будет продолжать распознавать определения переменных строка за строкой, пока не найдет другое зарезервированное слово. Можно было бы поставить var и во вторую строку, но это не обязательно. Также было бы допустимо поместить все три переменные в одну строку, но ваш стиль программирования будет диктовать, где вы поместите три переменные. После двоеточия в каждой строке стоит слово целое число , которое является стандартным идентификатором и поэтому отличается от зарезервированного слова. Стандартный идентификатор предопределен как зарезервированное слово, но вы можете переопределить его, тем самым потеряв свое первоначальное назначение и значение. Пока и в течение длительного времени, не делайте этого.

НАША ПЕРВАЯ АРИФМЕТИКА

Теперь, когда у нас есть три переменные, определенные как целочисленных переменных типа , мы можем использовать их в программе любым способом, который мы хотим, пока мы используем их правильно. Если бы мы попытались присвоить real value to X , компилятор выдаст ошибку и предотвратит вывод мусора. Обратите внимание на начало основной части программы. Есть три оператора, присваивающие значения X , Y и Count . Прекрасная математическая точка зрения гласит, что Count равно только значению X + Y , пока одно из них не будет изменено, поэтому знак равенства, используемый во многих других языках, здесь не используется. Знак := используется и может быть прочитан как «заменяется значением» при чтении листинга. Другой более быстрый способ — использовать слово «получает». Таким образом X := X + 1 будет читаться как " X получает значение X плюс 1". Позже мы увидим, что простой знак равенства зарезервирован для другого использования в Паскале.

Первые три оператора дают X значение 12, Y значение 13 и Count значение 12 + 13 или 25. Чтобы получить эти значения из компьютера, нам нужен другой расширение оператора Writeln . Первая часть данных в круглых скобках должна быть вам хорошо знакома, но вторая часть является новой.

Несколько выходов могут обрабатываться в одном Writeln , если поля разделены запятой. Чтобы вывести переменную, просто напишите имя переменной в поле вывода. Число, следующее за переменной в каждом случае, является количеством выходных столбцов, которые будут использоваться выходными данными. Это число является необязательным и может быть опущено, что позволит системе использовать столько столбцов, сколько ей нужно. Для наглядности всем им присвоено разное количество столбцов. На этом этапе вы можете скомпилировать и запустить INTVAR.PAS и изучить его вывод.

Пример программы ------> INTVAR2.PAS

Чтобы проиллюстрировать различные способы вывода данных, загрузите INTVAR2.PAS и обратите внимание, что хотя выходные данные идентичны, они выводятся совершенно по-разному. Операторы Writeln разбиваются на части, и отдельные части выводятся с помощью операторов Write и Writeln . Обратите внимание, что Writeln сам по себе просто перемещает курсор в начало новой строки на видеомониторе.

Скомпилируйте и запустите эту программу и посмотрите на ее вывод после того, как убедитесь, что эти две программы действительно идентичны.

ТЕПЕРЬ ДАВАЙТЕ ИСПОЛЬЗОВАТЬ МНОГО ПЕРЕМЕННЫХ

Пример программы ------> ALLVAR.PAS

Загрузите ALLVAR.PAS для просмотра короткой программы, использующей пять основных типов данных. Переменным присваиваются значения, и значения печатаются. Полное и подробное описание опций, доступных в операторе Write , приведено в вашем справочном руководстве по TURBO Pascal. Проверьте индекс, чтобы найти эту информацию для версии, которую вы используете. Вам будет полезно прочитать этот раздел сейчас, так как будет дано очень мало объяснений по поводу 9.0003 С этого момента напишите оператора. Мы обсудим метод, с помощью которого мы можем записывать файлы на диск или другие устройства вывода, в следующей главе этого руководства.

Вернуться к основным типам. Паскаль выполняет множество перекрестных проверок на наличие очевидных ошибок. Недопустимо присваивать значение любой переменной со значением неправильного типа или за пределами допустимого диапазона этой переменной. Существуют процедуры для преобразования из одной системы в другую, когда это необходимо. Предположим, например, что вы хотите использовать значение целых в расчете реальных чисел. Это возможно, если сначала преобразовать целое число в действительное число того же значения и использовать новую переменную типа real в желаемых вычислениях. Новая переменная типа real , конечно, должна быть определена в операторе var как переменная типа real , прежде чем ее можно будет использовать. Подробная информация о том, как выполнить несколько преобразований такого типа, будет приведена в примере программы с именем CONVERT.PAS далее в этой главе.

Пример программы ------> REALMATH.PAS

Поскольку у нас определены некоторые переменные, было бы неплохо использовать свойства компьютеров, которыми они известны, а именно некоторые арифметические операции. Для вашего наблюдения доступны две программы, иллюстрирующие различные виды математики: REALMATH.PAS, использующая реальных переменных, и INTMATH.PAS, использующая целочисленных переменных. Вы можете редактировать, компилировать и запускать их самостоятельно без каких-либо дополнительных комментариев от меня, кроме комментариев, встроенных в исходные файлы. Вы должны вывести некоторые результаты, используя метод вывода, показанный в предыдущем примере программы. Прочтите определение того, как это сделать, в Руководстве пользователя TURBO Pascal.

Пример программы ------> INTMATH.PAS

Пример программы с именем INTMATH.PAS иллюстрирует некоторые математические возможности Паскаля при использовании целочисленных переменных типа . Переменная типа размером байта используется точно так же, как целочисленная переменная , но с гораздо меньшим допустимым диапазоном. Только один байт компьютерной памяти используется для каждой переменной, определенной как байтовая переменная типа , но 2 используются для каждой целочисленной переменной типа .

BOOLEAN VARIABLES

Пример программы ------> BOOLMATH.PAS

Давайте посмотрим на переменную типа boolean , которая может принимать только два разных значения, TRUE или FALSE . Эта переменная используется для управления циклом, индикаторами конца файла или любыми другими ИСТИННЫМИ или ЛОЖНЫМИ условиями в программе. Переменные можно сравнивать, чтобы определить логическое значение . Полный список реляционных операторов, доступных в Pascal, приведен в следующем списке.

 = равно 
не равно
> больше
>= больше или равно

Эти операторы можно использовать для сравнения любых простых типов данных, включая целое число , символ , байт , и реальных переменных или констант типа , и их можно использовать для сравнения логических переменных. Иллюстрация — лучший способ узнать о логической переменной , поэтому загрузите BOOLMATH.PAS и изучите ее.

В BOOLMATH.PAS мы определяем несколько логических переменных и две целочисленных переменных типа для использования в программе и начинаем с присвоения значений двум целочисленным переменным . Выражение Junk = Who в строке 14 на самом деле является логической операцией , которая неверна, поскольку значение Junk не равно значению Who . Таким образом, результатом будет ЛОЖЬ, и это значение присваивается логическое значение переменная A . Булевой переменной B присваивается значение TRUE, поскольку логическое выражение Junk = (Who - 1) истинно. Логическим переменным C и D также присваиваются некоторые значения способом, который не нуждается в комментариях. После присвоения значения переменной с большим именем все значения выводятся на печать. Обратите внимание, что если либо A , либо B имеет значение TRUE, результат в строке 18 будет TRUE.

ГДЕ МЫ ИСПОЛЬЗУЕМ БУЛЕВЫЕ ПЕРЕМЕННЫЕ?

Мы найдем много применений переменной типа boolean , когда вскоре будем изучать циклы и условные операторы, но до тех пор мы можем только узнать, что они из себя представляют. Часто в условном операторе вы хотите что-то сделать, если оба условия верны, и в этом случае вы будете использовать зарезервированные слова и с двумя логическими выражениями. Если оба верны, результат будет истинным. Строка 29 является примером этого. Если boolean переменные B , C и D истинны, тогда результат будет истинным и A будет присвоено значение TRUE. Если какое-либо из них ложно, результат будет ложным, и A будет присвоено значение ЛОЖЬ.

В строке 31, где проиллюстрирован оператор или , если любая из трех логических переменных истинна, результат будет истинным, а если все три ложны, результат будет ложным. Еще логический оператор - это , а не , который показан в строке 30 и инвертирует смысл логической переменной D . Изучите строку 33, в которой говорится, что результат верен, только если переменная Junk на единицу меньше, чем Who , или если Junk равно Who . Это должно указывать уровень гибкости, доступный с помощью логической переменной .

Скомпилируйте и запустите эту программу, затем добавьте дополнительную распечатку, чтобы увидеть,0003 boolean переменные изменяются так, как вы думаете, что они должны в последних нескольких операторах.

КОРОТКОЕ ЗАМЫКАНИЕ ИЛИ ПОЛНАЯ ОЦЕНКА?

Предположим, у вас есть несколько логических выражений " и ", объединенных вместе, и когда начинается вычисление, первое выражение дает FALSE. Поскольку первое выражение равно FALSE, следующие выражения никогда не могут позволить окончательному результату быть TRUE, потому что первое FALSE заставит ответ быть FALSE. Продолжать вычислять термины, если окончательный результат уже известен, кажется пустой тратой времени, но это именно то, что будет делать стандартный Паскаль из-за определения языка. Это называется полной оценкой логическое выражение . Если система достаточно умна, чтобы понять, что окончательный результат известен, она может остановить оценку, как только станет известен окончательный результат. Это называется оценкой короткого замыкания логического выражения и может также применяться, если член или ed логического выражения приводит к ИСТИННОМУ результату, поскольку результат всегда будет ИСТИННЫМ.

Версия TURBO Pascal 5.0 и выше позволяет выбирать между полной оценкой или оценкой короткого замыкания. По умолчанию для этих компиляторов используется форма короткого замыкания, но ее можно изменить в меню «Параметры» при использовании интегрированной среды или с помощью директивы компилятора.

ПОСМОТРИМ НА ПЕРЕМЕННУЮ ТИП СИМВОЛ

Пример программы ------> CHARDEMO.PAS

Переменная типа char является очень полезной переменной, но обычно не используется отдельно. Он очень эффективен при использовании в массиве или какой-либо другой определяемой пользователем структуре данных, которая выходит за рамки этой главы. Очень простая программа CHARDEMO.PAS включена, чтобы дать вам представление о том, как можно использовать переменную типа char . Изучите, затем скомпилируйте и запустите CHARDEMO.PAS, чтобы получить краткое представление о том, что такое char Переменная типа используется для.

Пример программы ------> CONVERT. PAS

Изучите пример программы CONVERT.PAS на предмет нескольких примеров преобразования данных из одной простой переменной в другую. Комментарии делают программу понятной, за исключением строк, которые мы изучим в главе 7 этого руководства.

РАСШИРЕННЫЕ ЦЕЛЫЕ ТИПЫ

Пример программы ------> EXTINT.PAS

Показать программу EXTINT.PAS для примера использования расширенного целых типов, доступных с компилятором Pascal. Определяются четыре переменные и каждой присваиваются значения, после чего отображаются результаты. Когда вы скомпилируете и запустите программу, вы увидите, что переменная Big_int действительно может обрабатывать довольно большое число.

Следует отметить, что расчеты в строках 13 и 21 приводят к разным ответам, хотя кажется, что они вычисляют одно и то же. Объяснение в порядке. Количество с именем MaxInt , используемый в строках 10 и 13, представляет собой константу, встроенную в систему, которая представляет наибольшее значение, которое может хранить переменная типа integer . На первой странице этой главы мы определили это как 32767, и при запуске программы вы обнаружите, что Index отображает это значение так, как должно. Константа MaxInt имеет тип universal_integer , как и все числовые константы в строке 13. Затем результат вычисляется по количеству значащих цифр, указанному в левой части оператора присваивания, который типа longint приводит к очень большому числу.

Когда мы доходим до строки 21, переменная Index имеет тип integer , поэтому вычисления выполняются так, как если бы константы имели тип integer , что также приводит к усечению некоторых наиболее значащих цифр. Усеченный результат преобразуется в тип longint и присваивается переменной Big_int , а усеченное значение отображается в строке 22.

После этого обсуждения вам должно быть очевидно, что важно, какие типы вы используете для своих переменных. Следует подчеркнуть, что было бы неразумно использовать все переменные большого типа, поскольку они требуют больше места для хранения и замедляют вычисления. Опыт подскажет, какие типы данных следует использовать для каждого приложения.

EXTENDED REAL TYPES

Пример программы ------> EXTREAL.PAS

Отобразите программу EXTREAL.PAS для примера, используя новый " real " типы, доступные в новых версиях TURBO Pascal.

Если вы используете версию TURBO Pascal 5.0 или более новую, вы можете использовать математический сопроцессор 80X87. можно сказать, за исключением того, что когда вы запускаете его, вы можете наблюдать относительную точность каждого из типов переменных.Еще раз, вы должны иметь в виду, что использование более крупных типов « реальных » требует дополнительного места для хранения и сокращения времени выполнения. скорость времени, но дает вам большую точность.

Основы, часть 2 — Документация Construct 2.10

Целые числа и числа с плавающей запятой

Основы информатики 101. Все целые числа следуют за Int{8,16,24,32,64}{u,s}{b,l,n }, а числа с плавающей запятой следуют шаблонам именования Float{16,32,64}{b,l}. Порядок следования байтов может быть либо прямым порядком байтов, прямым порядком байтов, либо родным. Целые числа могут быть знаковыми или беззнаковыми (только неотрицательными). Поплавки не имеют беззнакового типа. Обратите внимание, что Float16{b,l} совместим только с Python 3.6 и выше.

 >>> Int64sl.build(500)
б'\xf4\x01\x00\x00\x00\x00\x00\x00'
>>> Int64sl.build(-23)
б'\xe9\xff\xff\xff\xff\xff\xff\xff'
 

Несколько полей имеют псевдонимы, Byte среди целых чисел и Single среди чисел с плавающей запятой.

 Байт <--> Int8ub
Короткий <--> Int16ub
Целое <--> Int32ub
Длинный <--> Int64ub
Половина <--> Float16b
Одиночный <--> Float32b
Двойной <--> Float64b
 

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

 >>> VarInt.build(127)
б'\x7f'
>>> VarInt.build(1234567890)
б'\xd2\x85\xd8\xcc\x04'
 

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

 >>> ZigZag.build(-3)
б'\х05'
>>> ZigZag.build(3)
б'\х06'
 

Длинные целые числа (или особо нечетные) могут быть закодированы с использованием BytesInteger . Вот 128-битное целое.

 >>> BytesInteger(16).build(255)
б'\х00\х00\х00\х00\х00\х00\х00\х00\х00\х00\х00\х00\х00\х00\х00\хфф'
 

Некоторые числовые классы реализованы с использованием модуля struct , другие используют поле BytesInteger.

 >>> d = FormatField("<","l") или BytesInteger(4, swapped=True)
>>> д.сборка(1)
б'\х01\х00\х00\х00'
 

Байты и биты

Предупреждение

Строковые литералы без префиксов, такие как «данные», в Python 3 интерпретируются как Unicode. Это вызывает сбои при использовании таких полей, как Bytes .

«Строки» байтов ( str в PY2 и байт в PY3) можно перемещать как есть. Биты обсуждаются в следующей главе.

 >>> Байты(5).сборка(b"12345")
б'12345'
>>> Байты(5). parse(b"12345")
б'12345'
 

Байты также могут быть использованы до конца потока. Туннелирование обсуждается в следующей главе.

 >>> GreedyBytes.parse(b"39217839219...")
б'39217839219...'
 

С недавнего времени вы также можете строить из массивов байтов:

 >>> d = GreedyBytes или Bytes(5)
>>> d.build(массив байтов(b'12345'))
б'12345'
 

Строки

Примечание

Такие кодировки, как UTF8 UTF16 UTF32 (включая прямой порядок следования байтов), прекрасно работают со всеми классами String*. Однако два из них, PaddedString и CString, поддерживают только кодировки, явно указанные в возможных кодировках строк .

PaddedString — это конструкция фиксированной длины, которая дополняет построенную строку нулевыми байтами и удаляет те же самые нулевые байты при синтаксическом анализе. Строки также можно обрезать при построении. Если вы укажете слишком длинную строку, конструкция отрежет ее на части вместо того, чтобы вызвать StringError.

Честно говоря, использовать этот класс не рекомендуется. Он предоставляется только для старых форматов данных.

 >>> PaddedString(10, "utf8").build("Афон")
б'\xd0\x90\xd1\x84\xd0\xbe\xd0\xbd\x00\x00'
 

PascalString — это строка переменной длины, перед которой стоит поле длины. Эта схема была изобретена на языке Pascal, который поместил поле Byte вместо соглашения C о добавлении нулевого байта \0 в конце. Обратите внимание, что поле длины не обязательно должно быть байтовым, а также может иметь переменную длину, как показано ниже. VarInt рекомендуется при разработке новых протоколов.

 >>> PascalString(VarInt, "utf8").build("Афон")
б'\x08\xd0\x90\xd1\x84\xd0\xbe\xd0\xbd'
 

CString — это еще одно строковое представление, которое всегда заканчивается нулевым завершающим байтом \0 в конце. Эта схема была придумана на языке C и очень хорошо известна в компьютерном сообществе. Один из авторов, Керниган или Ритчи, признал, что это было одно из самых прискорбных дизайнерских решений в истории.

 >>> CString("utf8").build(u"привет")
привет\x00'
 

Последним будет GreedyString, который делает то же самое, что и GreedyBytes, плюс кодирует. Он читает до конца потока, а затем декодирует данные, используя указанную кодировку. Жадные* классы обычно используются с конструкциями туннелирования, которые обсуждаются в одной из последующих глав.

 >>> GreedyString("utf8").parse(b"329817392189")
'329817392189'
 

Сопоставления

Логические значения — это флаги:

 >>> Flag.parse(b"\x01")
Истинный
>>> Flag.build(Истина)
б'\х01'
 

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

 >>> d = Enum(Byte, один=1, два=2, четыре=4, восемь=8)
>>> d.parse(b"\x01")
'один'
>>> int(d.parse(b"\x01"))
1
>>> d.parse(b"\xff")
255
>>> int(d.parse(b"\xff"))
255
 

Обратите внимание, что строковые значения также можно получить с помощью членов атрибутов.

 >>> d.build(d.one или "один" или 1)
б'\х01'
>>> д.один
'один'
 

FlagsEnum разбивает целочисленное значение на набор строковых меток:

 >>> d = FlagsEnum(Byte, one=1, two=2, Four=4, восемь=8)
>>> d.parse(b"\x03")
Контейнер (один = истина, два = истина, четыре = ложь, восемь = ложь)
>>> d.build(dict(one=True,two=True))
б'\х03'
 

Обратите внимание, что строковые значения также можно получить с помощью членов атрибутов.

 >>> d.build(d.one|d.two или «один|два» или 1|2)
б'\х03'
 

И Enum, и FlagsEnum поддерживают объединение меток из IntEnum и IntFlag (модуль enum34):

 import enum
класс E (enum.IntEnum или enum.IntFlag):
    один = 1
    два = 2
Enum(Byte, E) <--> Enum(Byte, один=1, два=2)
FlagsEnum(Byte, E) <--> FlagsEnum(Byte, one=1, two=2)
 

Предупреждение

Использование модуля enum34 устарело и не должно использоваться.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *