除了static_stream还有stream可以进行按位读写之外,TBOX还提供了更加原始、更加底层的位数据操作接口,例如直接对某个数据指针的位读取操作,可以使用utils库的tb_bits_get_xxx和tb_bits_set_xxx 系列接口, 这个更加的轻量:

    1. // p指向某个数据地址
    2. tb_byte_t* p = data;
    3.  
    4. // 按大端读取16位数据
    5. tb_uint16_t u16_be = tb_bits_get_u16_be(p);
    6.  
    7. // 按小端读取24位数据
    8. tb_uint32_t u24_le = tb_bits_get_u24_le(p);
    9.  
    10. // 按本地端读取32位数据
    11. tb_uint32_t u32_ne = tb_bits_get_u32_ne(p);
    12.  
    13. // 按大端读取64位数据
    14. tb_uint64_t u64_be = tb_bits_get_u64_be(p);
    15.  
    16. // 读取从第1位开始的后续5位无符号数据
    17. tb_uint32_t u5 = tb_bits_get_ubits32(p, 1, 5);
    18.  
    19. // 按大端读取浮点值
    20. tb_float_t float_be = tb_bits_get_float_be(p);
    21.  
    22. // 按浮点大端、字小端读取双精度浮点值
    23. tb_double_t double_ble = tb_bits_get_double_ble(p);
    24.  
    25. // 按浮点本地端、字本地端读取双精度浮点值
    26. tb_double_t double_nne = tb_bits_get_double_nne(p);
    27.  
    28. // 交换无符号16位数值
    29. u16 = tb_bits_swap_u16(u16);
    30.  
    31. // 交换无符号32位数值
    32. u32 = tb_bits_swap_u32(u32);
    33.  
    34. // 交换无符号64位数值
    35. u64 = tb_bits_swap_u64(u64);
    36.  
    37. // 将本地端的u32数值转为大端u32数值
    38. u32_be = tb_bits_ne_to_be_u32(u32_ne);
    39.  
    40. // 将小端的u64值转为大端u64数值
    41. u64_be = tb_bits_ne_to_be_u32(u64_le);
    42.  
    43. // 按大端顺序获取u32的前导0的位数
    44. count = tb_bits_cl0_u32_be(val);
    45.  
    46. // 按小端顺序获取u64的前导1的位数
    47. count = tb_bits_cl1_u64_le(val);
    48.  
    49. // 按大端顺序获取u32的第一个位0的索引位置
    50. index = tb_bits_fl0_u32_be(val);
    51.  
    52. // 按小端顺序获取u64的第一个位1的索引位置
    53. index = tb_bits_fl1_u64_le(val);
    54.  
    55. // 获取u32的位0的总数
    56. count = tb_bits_cb0_u32(val);
    57.  
    58. // 获取u63的位1的总数
    59. count = tb_bits_cb1_u64(val);