Reader
Хранение сетевых данных и предоставление интерфейса для парсинга.
Reader предоставляет способ извлечения типизированных данных из последовательности байтов. Reader управляет базовыми структурами данных для предоставления курсора чтения по непрерывной последовательности байтов. Это полезно для декодирования данных, получаемых по сети или хранящихся в файле. Блоки байтов добавляются в Reader с помощью метода append, а типизированные данные извлекаются с помощью методов-геттеров.
Например, предположим, что у нас есть сетевой протокол на основе UDP, где сообщения состоят из следующего:
-
list_size— количество элементов в последующем списке элементов как 32-битовое целое число в формате big-endian - ноль или более элементов следующих данных:
- число с плавающей точкой 64-бита в формате big-endian
- строка, начинающаяся с 32-битового целого числа в формате big-endian, указывающего длину строки, за которой следует количество байтов, представляющих строку
Сообщение могло бы выглядеть так:
[message_length][list_size][float1][string1][float2][string2]...
Следующая программа использует Reader для декодирования сообщения такого типа и вывода их:
use "buffered"
use "collections"
class Notify is InputNotify
let _env: Env
new create(env: Env) =>
_env = env
fun ref apply(data: Array[U8] iso) =>
let rb = Reader
rb.append(consume data)
try
while true do
let len = rb.i32_be()?
let items = rb.i32_be()?.usize()
for range in Range(0, items) do
let f = rb.f32_be()?
let str_len = rb.i32_be()?.usize()
let str = String.from_array(rb.block(str_len)?)
_env.out.print("[(" + f.string() + "), (" + str + ")]")
end
end
end
actor Main
new create(env: Env) =>
env.input(recover Notify(env) end, 1024)
class ref Reader
Конструкторы
create
new iso create() : Reader iso^
Возвращает
- Reader iso^
Общедоступные функции
size
Возвращает количество доступных байтов.
fun box size() : USize val
Возвращает
- USize val
clear
Отбрасывает все ожидаемые данные.
fun ref clear() : None val
Возвращает
- None val
append
Добавляет блок данных.
fun ref append( data: (String val | Array[U8 val] val)) : None val
Параметры
Возвращает
- None val
skip
Пропускает n байтов.
fun ref skip( n: USize val) : None val ?
Параметры
- n: USize val
Возвращает
- None val ?
block
Возвращает блок как непрерывный фрагмент памяти. Вызовет ошибку, если запрашиваемый блок больше, чем текущий объем данных в Reader.
fun ref block( len: USize val) : Array[U8 val] iso^ ?
Параметры
- len: USize val
Возвращает
read_until
Находит первое вхождение разделителя и возвращает блок байтов перед его позицией. Разделитель не включается в возвращаемый массив, но удаляется из буфера. Для чтения строки текста предпочтительнее использовать line(), которая обрабатывает \n и \r\n.
fun ref read_until( separator: U8 val) : Array[U8 val] iso^ ?
Параметры
- separator: U8 val
Возвращает
line
Возвращает строку, завершенную \n или \r\n, как строку. По умолчанию символ новой строки не включается в возвращаемую строку, но удаляется из буфера. Установите keep_line_breaks в true, чтобы сохранить символы перевода строки в возвращаемой строке.
fun ref line( keep_line_breaks: Bool val = false) : String iso^ ?
Параметры
- keep_line_breaks: Bool val = false
Возвращает
- String iso^ ?
u8
Получает U8. Вызывает ошибку, если данных недостаточно.
fun ref u8() : U8 val ?
Возвращает
- U8 val ?
i8
Получает I8.
fun ref i8() : I8 val ?
Возвращает
- I8 val ?
u16_be
Получает 16-битовое целое число big-endian.
fun ref u16_be() : U16 val ?
Возвращает
- U16 val ?
u16_le
Получает 16-битовое целое число little-endian.
fun ref u16_le() : U16 val ?
Возвращает
- U16 val ?
i16_be
Получает 16-битовое целое число со знаком big-endian.
fun ref i16_be() : I16 val ?
Возвращает
- I16 val ?
i16_le
Получает 16-битовое целое число со знаком little-endian.
fun ref i16_le() : I16 val ?
Возвращает
- I16 val ?
u32_be
Получить U32 в формате big-endian.
fun ref u32_be() : U32 val ?
Возвращает
- U32 val ?
u32_le
Получить U32 в формате little-endian.
fun ref u32_le() : U32 val ?
Возвращает
- U32 val ?
i32_be
Получить I32 в формате big-endian.
fun ref i32_be() : I32 val ?
Возвращает
- I32 val ?
i32_le
Получить I32 в формате little-endian.
fun ref i32_le() : I32 val ?
Возвращает
- I32 val ?
u64_be
Получить U64 в формате big-endian.
fun ref u64_be() : U64 val ?
Возвращает
- U64 val ?
u64_le
Получить U64 в формате little-endian.
fun ref u64_le() : U64 val ?
Возвращает
- U64 val ?
i64_be
Получить I64 в формате big-endian.
fun ref i64_be() : I64 val ?
Возвращает
- I64 val ?
i64_le
Получить I64 в формате little-endian.
fun ref i64_le() : I64 val ?
Возвращает
- I64 val ?
u128_be
Получить U128 в формате big-endian.
fun ref u128_be() : U128 val ?
Возвращает
- U128 val ?
u128_le
Получить U128 в формате little-endian.
fun ref u128_le() : U128 val ?
Возвращает
- U128 val ?
i128_be
Получить I129 в формате big-endian.
fun ref i128_be() : I128 val ?
Возвращает
- I128 val ?
i128_le
Получить I128 в формате little-endian.
fun ref i128_le() : I128 val ?
Возвращает
- I128 val ?
f32_be
Получить F32 в формате big-endian.
fun ref f32_be() : F32 val ?
Возвращает
- F32 val ?
f32_le
Получить F32 в формате little-endian.
fun ref f32_le() : F32 val ?
Возвращает
- F32 val ?
f64_be
Получить F64 в формате big-endian.
fun ref f64_be() : F64 val ?
Возвращает
- F64 val ?
f64_le
Получить F64 в формате little-endian.
fun ref f64_le() : F64 val ?
Возвращает
- F64 val ?
peek_u8
Просмотреть U8 по заданному смещению. Поднять ошибку, если данных недостаточно.
fun box peek_u8( offset: USize val = 0) : U8 val ?
Параметры
- offset: USize val = 0
Возвращает
- U8 val ?
peek_i8
Просмотреть I8.
fun box peek_i8( offset: USize val = 0) : I8 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I8 значение ?
peek_u16_be
Просмотр U16 в формате big-endian.
fun box peek_u16_be( offset: USize val = 0) : U16 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U16 значение ?
peek_u16_le
Просмотр U16 в формате little-endian.
fun box peek_u16_le( offset: USize val = 0) : U16 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U16 значение ?
peek_i16_be
Просмотр I16 в формате big-endian.
fun box peek_i16_be( offset: USize val = 0) : I16 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I16 значение ?
peek_i16_le
Просмотр I16 в формате little-endian.
fun box peek_i16_le( offset: USize val = 0) : I16 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I16 значение ?
peek_u32_be
Просмотр U32 в формате big-endian.
fun box peek_u32_be( offset: USize val = 0) : U32 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U32 значение ?
peek_u32_le
Просмотр U32 в формате little-endian.
fun box peek_u32_le( offset: USize val = 0) : U32 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U32 значение ?
peek_i32_be
Просмотр I32 в формате big-endian.
fun box peek_i32_be( offset: USize val = 0) : I32 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I32 значение ?
peek_i32_le
Просмотр I32 в формате little-endian.
fun box peek_i32_le( offset: USize val = 0) : I32 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I32 значение ?
peek_u64_be
Просмотр U64 в формате big-endian.
fun box peek_u64_be( offset: USize val = 0) : U64 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U64 значение ?
peek_u64_le
Просмотр U64 в формате little-endian.
fun box peek_u64_le( offset: USize val = 0) : U64 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U64 значение ?
peek_i64_be
Просмотр I64 в формате big-endian.
fun box peek_i64_be( offset: USize val = 0) : I64 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I64 значение ?
peek_i64_le
Просмотр I64 в формате little-endian.
fun box peek_i64_le( offset: USize val = 0) : I64 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I64 значение ?
peek_u128_be
Просмотр U128 в формате big-endian.
fun box peek_u128_be( offset: USize val = 0) : U128 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U128 значение ?
peek_u128_le
Просмотр U128 в формате little-endian.
fun box peek_u128_le( offset: USize val = 0) : U128 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- U128 значение ?
peek_i128_be
Просмотр I129 в формате big-endian.
fun box peek_i128_be( offset: USize val = 0) : I128 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I128 значение ?
peek_i128_le
Просмотр I128 в формате little-endian.
fun box peek_i128_le( offset: USize val = 0) : I128 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- I128 значение ?
peek_f32_be
Просмотр F32 в формате big-endian.
fun box peek_f32_be( offset: USize val = 0) : F32 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- F32 значение ?
peek_f32_le
Просмотр F32 в формате little-endian.
fun box peek_f32_le( offset: USize val = 0) : F32 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- F32 значение ?
peek_f64_be
Просмотр F64 в формате big-endian.
fun box peek_f64_be( offset: USize val = 0) : F64 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- F64 значение ?
peek_f64_le
Просмотр F64 в формате little-endian.
fun box peek_f64_le( offset: USize val = 0) : F64 val ?
Параметры
- смещение: USize значение = 0
Возвращаемое значение
- F64 значение ?
© 2016-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/buffered-Reader