Skip to content

静态流的读写

ruki edited this page Aug 7, 2014 · 1 revision

静态流主要用于按位读写,可以让你很方便的对各种数据文件格式进解析,并且实现能够在不占用太多内存的情况下,进行边读边解析。

其中,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);
}
Clone this wiki locally