ustruct.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. 打包和解包原始数据类型。
  3. ustruct 模块在 Python 值和以 Python 字节对象表示的 C 结构之间执行转换。
  4. 支持 size/byte 的前缀: @, <, >, !.
  5. 支持的格式代码: b, B, h, H, i, I, l, L, q, Q, s, P, f, d (最后2个需要支持浮点数).
  6. """
  7. def calcsize(fmt) -> None:
  8. """
  9. 返回存放某一类型数据 fmt 需要的字节数。
  10. - fmt:数据类型
  11. - b — 字节型
  12. - B — 无符号字节型
  13. - h — 短整型
  14. - H — 无符号短整型
  15. - i — 整型
  16. - I — 无符号整型
  17. - l — 整型
  18. - L — 无符号整型
  19. - q — 长整型
  20. - Q — 无符号长整型
  21. - f — 浮点型
  22. - d — 双精度浮点型
  23. - P — 无符号型
  24. 示例:
  25. - print(struct.calcsize("i"))
  26. - 4
  27. - print(struct.calcsize("B"))
  28. - 1
  29. """
  30. ...
  31. def pack(fmt, v1, v2, ...) -> None:
  32. """
  33. 按照格式字符串 fmt 打包参数 v1, v2, ... 。返回值是参数打包后的字节对象。
  34. fmt:同 calcsize。
  35. 示例:
  36. - struct.pack("ii", 3, 2)
  37. - b'\x03\x00\x00\x00\x02\x00\x00\x00'
  38. - ustruct.unpack(fmt, data)
  39. 从 fmt 中解包数据。返回值是解包后参数的元组。
  40. data:要解压的字节对象。
  41. 示例:
  42. - buf = struct.pack("bb", 1, 2)
  43. - print(buf)
  44. - b'\x01\x02'
  45. - print(struct.unpack("bb", buf))
  46. - (1, 2)
  47. """
  48. ...
  49. def pack_into(fmt, buffer, offset, v1, v2, ...) -> None:
  50. """按照格式字符串 fmt 压缩参数 v1, v2, ... 到缓冲区 buffer,开始位置是 offset。当offset 为负数时,从缓冲区末尾开始计数。"""
  51. ...
  52. def unpack_from(fmt, data, offset=0) -> None:
  53. """
  54. 以 fmt 作为规则从 data 的 offset 位置开始解包数据,如果 offset 是负数就是从缓冲区末尾开始计算。
  55. 返回值是解包后的参数元组。
  56. - buf = struct.pack("bb", 1, 2)
  57. - print(struct.unpack("bb", buf))
  58. - (1, 2)
  59. - print(struct.unpack_from("b", buf, 1))
  60. - (2,)
  61. """
  62. ...