静态流主要用于按位读写,可以让你很方便的对各种数据文件格式进解析,并且实现能够在不占用太多内存的情况下,进行边读边解析。
其中,stream和static_stream都提供了按位读写的接口。但是stream比较通用,适合各种数据流,但是比较重量级。 而static_stream仅仅针对固定大小的静态buffer数据进行操作,比较轻量快速,而且对位的操作更灵活。
下面简单介绍下静态流的读取操作,写数据类似,具体可以参看头文件的接口定义:
- // 初始化静态位流数据
- tb_static_stream_t stream;
- if (tb_static_stream_init(&stream, data, size))
- {
- // 按大端读取16位数据
- tb_uint16_t u16_be = tb_static_stream_read_u16_be(&stream);
- // 按小端读取24位数据
- tb_uint32_t u24_le = tb_static_stream_read_u24_le(&stream);
- // 按本地端读取32位数据
- tb_uint32_t u32_ne = tb_static_stream_read_u32_ne(&stream);
- // 按大端读取64位数据
- tb_uint64_t u64_be = tb_static_stream_read_u64_be(&stream);
- // 读取5位无符号数据
- tb_uint32_t u5 = tb_static_stream_read_ubits32(&stream, 5);
- // 预读取6位有符号数据,不更新偏移
- tb_uint32_t u5 = tb_static_stream_peek_sbits32(&stream, 6);
- // 跳过18位数据
- tb_static_stream_skip_bits(&stream, 18);
- // 同步到下一个整字节
- tb_static_stream_sync(&stream);
- // 跳过3个字节
- tb_static_stream_skip(&stream, 3);
- // 读取一个c风格字符串
- tb_char_t const* string = tb_static_stream_read_cstr(&stream);
- // 按大端读取浮点值
- tb_float_t float_be = tb_static_stream_read_float_be(&stream);
- // 按浮点大端、字小端读取双精度浮点值
- tb_double_t double_ble = tb_static_stream_read_double_ble(&stream);
- // 按浮点本地端、字本地端读取双精度浮点值
- tb_double_t double_nne = tb_static_stream_read_double_nne(&stream);
- // 当前位置的数据指针
- tb_byte_t const* pos = tb_static_stream_pos(&stream);
- // 起始位置的数据指针
- tb_byte_t const* beg = tb_static_stream_beg(&stream);
- // 结束位置的数据指针
- tb_byte_t const* end = tb_static_stream_end(&stream);
- // 当前的数据偏移
- tb_size_t offset = tb_static_stream_offset(&stream);
- // 当前剩余数据字节数
- tb_size_t left = tb_static_stream_left(&stream);
- // 总的数据字节数
- tb_size_t size = tb_static_stream_size(&stream);
- }