字节与缓冲
头文件:<dlt698/common/bytes.hpp>,命名空间 dlt698。
Bytes 与 ByteView
ByteView 是借用连续内存的只读视图,不拥有底层缓冲区。
生命周期约定
ByteView使用期间底层内存必须保持有效,且不能因容器扩容而移动。- 禁止从临时
Bytes构造,从编译期就杜绝悬空视图。 operator[]不检查边界,越界是未定义行为;先require或用subview。subview越界抛std::out_of_range。
codec 在调用结束前完成读取,返回的都是拥有内存的值;异步写会接管传入的 Bytes;异步读取完成时回调收到的是拥有内存的 Bytes。
Limits
所有编解码入口的最后一个参数都是 const Limits&,默认构造即可。
max_elements 统计的是节点总数而不是叶子数,包含根节点。FrameStreamDecoder 要求帧长度在 12 至 16385 字节之间,且流缓存上限不得小于帧上限,否则构造抛 std::invalid_argument。
DecodeFailure
这是 Reader/Writer 组合式接口的异常类型。完整输入的 codec 负责把它转换成 Result 错误,调用方通常不需要直接捕获它。
Reader
在借用视图上推进游标,读取失败抛 DecodeFailure。
be(n, field) 中 n > 8 抛 invalid_length;n == 0 返回 0。输入不足统一抛 need_more_data,错误偏移是当前游标位置。
Writer
拥有输出缓冲区的写入器,始终检查上限。
reserve(n) 先检查再分配,超限抛 resource_limit,不会写入部分内容。be 会截断高于 n 字节的位。
十六进制转换
from_hex接受大小写混排的十六进制字符,字节之间允许空白,不接受0x前缀。非法字符或半字节之间的空白返回invalid_value,奇数位返回invalid_length。失败时Error::offset是文本中的字符偏移。to_hex输出大写、字节之间单个空格分隔,空输入返回空字符串。