Преобразуйте текст в числа, обработайте отсутствующие значения и выберите байтовые операции для своего формата файла. Начните с текстового примера, затем найдите нужную функцию в таблицах.
Установите Топаз по инструкции «Первая программа». Сохраняйте каждый пример в отдельный файл .tpz и запускайте его из этого каталога.
Разберите и преобразуйте значения
Сохраните код в core-everyday.tpz.
function разобратьВсе(значения: Array<string>) -> Array<Option<int>> {
return map(значения, значение => toInt(значение))
}
let скалярные = "토파즈".scalars()
let разобранные = разобратьВсе(["1", "x", "3"])
print("{скалярные.length}:{разобранные}")Выполните topaz run core-everyday.tpz.
3:[Some(1), None, Some(3)]toInt успешно преобразует "1" и "3". Для "x" функция возвращает None, и map сохраняет это отсутствие в результате. Замените "x" на "2", чтобы получить Some(2) в середине массива.
В строке "토파즈" три скаляра Unicode. Скаляр соответствует одной кодовой точке Unicode вне диапазона суррогатов. scalars() возвращает массив строк с этими скалярами. Его длина считает скаляры, а число байтов или видимых символов может отличаться.
print принимает строку. Интерполяция внутри {...} преобразует значения в текст перед выводом.
Выберите повседневную функцию
| Задача | Вызов | Тип результата |
|---|---|---|
| Вывести строку | print(text) | () |
| Прочитать весь текст, переданный для запуска | input() | string |
| Разобрать целое число | toInt(text) | Option<int> |
| Разобрать число с основанием от 2 до 36 | toIntRadix(text, radix) | Option<int> |
| Преобразовать целое в число с плавающей точкой | toFloat(value) | float |
| Создать скаляр по кодовой точке | fromCodePoint(value) | Option<string> |
| Разбить текст на строки со скалярами | text.scalars() | Array<string> |
| Преобразовать, отобрать или накопить элементы | map, filter, reduce | Новое значение |
Каждый вызов input() в рамках одного запуска возвращает тот же полный текст. Для input и print окружение должно предоставлять ввод и вывод.
toFloat принимает int. Сначала разберите текст с целым числом через toInt. Для преобразования значений в текст используйте интерполяцию, для подсчёта элементов массива используйте .length. Свободных функций toString, len, println и type_of нет.
Преобразуйте Option и Result
Some и None создают Option. Ok и Err создают Result. Добавьте аннотацию типа, если компилятор не может вывести все аргументы типа. Это возможно для None, Ok, Err или пустой коллекции.
| Метод | Сигнатура | Поведение |
|---|---|---|
option.okOr | (error: E) -> Result<T, E> | Вычисляет error до вызова |
option.okOrElse | (f: () -> E) -> Result<T, E> | Вызывает f для None |
option.map | (f: (T) -> U) -> Option<U> | Преобразует значение внутри Some |
option.flatMap | (f: (T) -> Option<U>) -> Option<U> | Возвращает Option из f без дополнительного вложения |
result.map | (f: (T) -> U) -> Result<U, E> | Преобразует значение внутри Ok |
result.flatMap | (f: (T) -> Result<U, E>) -> Result<U, E> | Возвращает Result из f без дополнительного вложения |
Методы map и flatMap сохраняют None или Err, не вызывая f. Свободные функции map, filter и reduce работают с перебираемыми типами языка, например массивами. Эти функции не перехватывают ошибку выполнения (fault).
Соберите байты на месте
Сохраните код в core-byte-buffer.tpz.
let mut строка = ByteBuffer.allocate(8)
строка.fill(0, 8, 255)
строка.set(0, 137)
let mut кадр = ByteBuffer.allocate(12)
кадр.copy(строка, 0, 2, 8)
let данные = кадр.toBytes()
print(данные.toHex())Выполните topaz run core-byte-buffer.tpz.
000089ffffffffffffff0000Буфер строка содержит восемь байтов. fill заполняет их значением 255, а set заменяет первый байт на 137. copy копирует восемь байтов в кадр, начиная с индекса 2. Остальные байты остаются нулевыми.
ByteBuffer.allocate(length, value = 0) создаёт буфер фиксированной длины. Для вызовов set, fill и copy объявите переменную через let mut. Методы проверяют все диапазоны и значения байтов до записи. Неверные аргументы вызывают ошибку выполнения, оставляя целевой буфер без изменений.
Присваивание сохраняет доступ к общему буферу. ByteBuffer.fromBytes создаёт копию, а toBytes() создаёт неизменяемый снимок. ByteBuffer нельзя сравнивать, использовать как ключ Map или элемент Set, отображать как текст или JSON либо передавать через Web export.
Вычислите поле целостности CRC-32
Сохраните код в core-crc32.tpz.
let контрольнаяСумма = Hash.crc32(Bytes.encodeUtf8("123456789"))
print("{контрольнаяСумма}")Выполните topaz run core-crc32.tpz.
3421780262Hash.crc32(data) возвращает контрольную сумму CRC-32/ISO-HDLC как int в диапазоне 0..4294967295. std.hash.crc32 выполняет ту же операцию. Используйте её для полей целостности файлового формата. Она не подтверждает подлинность данных и не защищает от преднамеренной подмены.
Создайте DEFLATE с фиксированными кодами
Сохраните код в core-deflate.tpz.
match Codec.deflateFixedCompress(Bytes.encodeUtf8("hello")) {
case Ok(сжатое) => print(сжатое.toHex())
case Err(ошибка) => print(ошибка)
}Выполните topaz run core-deflate.tpz.
cb48cdc9c90700Codec.deflateFixedCompress создаёт один блок raw DEFLATE с фиксированными кодами Хаффмана. Одинаковый вход даёт одинаковые байты. Результат не содержит заголовка или контрольной суммы zlib либо gzip. Вход свыше 256 MiB возвращает Err.
Создайте zlib с фиксированными кодами
Сохраните код в core-zlib.tpz.
match Codec.zlibFixedCompress(Bytes.encodeUtf8("hello")) {
case Ok(сжатое) => print(сжатое.toHex())
case Err(ошибка) => print(ошибка)
}Выполните topaz run core-zlib.tpz.
7801cb48cdc9c90700062c0215Codec.zlibFixedCompress добавляет заголовок 78 01 и контрольную сумму Adler-32 к данным, сжатым фиксированными кодами Хаффмана. Одинаковый вход даёт одинаковые байты. Вход свыше 256 MiB возвращает Err.
У этой функции нет параметров распаковки, уровня сжатия, словаря или потоковой обработки. Отдельное вычисление Adler-32 она не предоставляет.
Добавьте защитные байты Reed–Solomon
Сохраните код в core-reed-solomon.tpz.
match Codec.reedSolomon255223Protect(Bytes.encodeUtf8("hello")) {
case Ok(защищённое) => print("{защищённое.length()}")
case Err(ошибка) => print(ошибка)
}Выполните topaz run core-reed-solomon.tpz.
255Функция делит вход на блоки по 223 байта и добавляет к каждому 32 байта чётности, получая кодовые слова RS(255,223). Последний короткий блок дополняется нулями. Храните исходную длину отдельно, чтобы отличить данные от заполнения.
Пустой вход или вход, требующий более 65 535 блоков, возвращает Err. Функция создаёт защитные байты. Для обнаружения или исправления повреждений нужен декодер.
Связанные операции
Вызовы типизированного JSON требуют одного явно указанного, полностью известного целевого типа. При ошибке данных возвращается путь, начинающийся с $. Свободная функция assert требует тестового профиля.
Перебираемые значения описаны в разделе «Операции с коллекциями», обработка ошибок в разделе Null, Option, Result и ошибки. Поведение среды выполнения объясняет результаты вычислений. Другие задачи перечислены в обзоре стандартной библиотеки.