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

    其中,stream和static_stream都提供了按位读写的接口。但是stream比较通用,适合各种数据流,但是比较重量级。 而static_stream仅仅针对固定大小的静态buffer数据进行操作,比较轻量快速,而且对位的操作更灵活。

    下面简单介绍下静态流的读取操作,写数据类似,具体可以参看头文件的接口定义:

    1. // 初始化静态位流数据
    2. tb_static_stream_t stream;
    3. if (tb_static_stream_init(&stream, data, size))
    4. {
    5. // 按大端读取16位数据
    6. tb_uint16_t u16_be = tb_static_stream_read_u16_be(&stream);
    7.  
    8. // 按小端读取24位数据
    9. tb_uint32_t u24_le = tb_static_stream_read_u24_le(&stream);
    10.  
    11. // 按本地端读取32位数据
    12. tb_uint32_t u32_ne = tb_static_stream_read_u32_ne(&stream);
    13.  
    14. // 按大端读取64位数据
    15. tb_uint64_t u64_be = tb_static_stream_read_u64_be(&stream);
    16.  
    17. // 读取5位无符号数据
    18. tb_uint32_t u5 = tb_static_stream_read_ubits32(&stream, 5);
    19.  
    20. // 预读取6位有符号数据,不更新偏移
    21. tb_uint32_t u5 = tb_static_stream_peek_sbits32(&stream, 6);
    22.  
    23. // 跳过18位数据
    24. tb_static_stream_skip_bits(&stream, 18);
    25.  
    26. // 同步到下一个整字节
    27. tb_static_stream_sync(&stream);
    28.  
    29. // 跳过3个字节
    30. tb_static_stream_skip(&stream, 3);
    31.  
    32. // 读取一个c风格字符串
    33. tb_char_t const* string = tb_static_stream_read_cstr(&stream);
    34.  
    35. // 按大端读取浮点值
    36. tb_float_t float_be = tb_static_stream_read_float_be(&stream);
    37.  
    38. // 按浮点大端、字小端读取双精度浮点值
    39. tb_double_t double_ble = tb_static_stream_read_double_ble(&stream);
    40.  
    41. // 按浮点本地端、字本地端读取双精度浮点值
    42. tb_double_t double_nne = tb_static_stream_read_double_nne(&stream);
    43.  
    44. // 当前位置的数据指针
    45. tb_byte_t const* pos = tb_static_stream_pos(&stream);
    46.  
    47. // 起始位置的数据指针
    48. tb_byte_t const* beg = tb_static_stream_beg(&stream);
    49.  
    50. // 结束位置的数据指针
    51. tb_byte_t const* end = tb_static_stream_end(&stream);
    52.  
    53. // 当前的数据偏移
    54. tb_size_t offset = tb_static_stream_offset(&stream);
    55.  
    56. // 当前剩余数据字节数
    57. tb_size_t left = tb_static_stream_left(&stream);
    58.  
    59. // 总的数据字节数
    60. tb_size_t size = tb_static_stream_size(&stream);
    61. }