pack_demo.lua 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. --[[
  2. @summary pack API演示脚本
  3. @version 1.0
  4. @date 2025.10.27
  5. @author 陈媛媛
  6. @usage
  7. 本脚本演示pack.pack和pack.unpack API的各种用法:
  8. 1、大小端编码演示:使用'<'和'>'格式符进行小端和大端编码
  9. 2、多种数据类型打包:打包short、int、float等多种数据类型
  10. 3、字符串格式演示:'a'格式(带长度前缀)和'z'格式(以null结尾)的字符串打包和解包
  11. 4、An格式演示:An格式(如A2、A5)的打包行为,即打包前n个字符串参数
  12. 5、指定位置解包:从指定位置开始解包数据
  13. 6、复杂数据组合:打包和解包复杂的数据结构,包括整数、字符串和短整数
  14. 7、边界情况测试:空数据打包和解包,以及数值边界测试
  15. ]]
  16. -- 初始化函数
  17. local function init()
  18. log.info("pack_demo", "脚本初始化完成")
  19. end
  20. -- 大小端编码演示
  21. local function demo_endian()
  22. log.info("\n--- 实验1:大小端编码 ---")
  23. -- 小端编码
  24. local data_le = pack.pack("<I", 0xAABBCCDD)
  25. log.info("小端编码:", data_le:toHex())
  26. -- 大端编码
  27. local data_be = pack.pack(">I", 0xAABBCCDD)
  28. log.info("大端编码:", data_be:toHex())
  29. -- 解包验证
  30. local _, val_le = pack.unpack(data_le, "<I")
  31. local _, val_be = pack.unpack(data_be, ">I")
  32. log.info("解包验证 - 小端:", string.format("0x%08X", val_le))
  33. log.info("解包验证 - 大端:", string.format("0x%08X", val_be))
  34. end
  35. -- 多种数据类型打包演示
  36. local function demo_mixed_types()
  37. log.info("\n--- 实验2:多种数据类型打包 ---")
  38. -- 打包多个不同类型数据
  39. local mixed_data = pack.pack("<hIf", 123, 456789, 3.14)
  40. log.info("混合数据打包:", mixed_data:toHex())
  41. -- 解包混合数据
  42. local _, short_val, int_val, float_val = pack.unpack(mixed_data, "<hIf")
  43. log.info("解包混合数据:", short_val, int_val, float_val)
  44. end
  45. -- 字符串格式演示
  46. local function demo_string_formats()
  47. log.info("\n--- 实验3:字符串格式演示 ---")
  48. -- 'a' 格式 - 带长度前缀的字符串
  49. local str_data_a = pack.pack('a', "LuatOS")
  50. log.info("'a'格式字符串:", str_data_a:toHex())
  51. -- 解包a格式
  52. local _, str_a = pack.unpack(str_data_a, 'a')
  53. log.info("'a'格式解包:", str_a)
  54. -- 'z' 格式 - 以null结尾的字符串
  55. local str_data_z = pack.pack('z', "LuatOS")
  56. log.info("'z'格式字符串:", str_data_z:toHex())
  57. -- 解包z格式
  58. local _, str_z = pack.unpack(str_data_z, 'z')
  59. log.info("'z'格式解包:", str_z)
  60. end
  61. -- An格式演示
  62. local function demo_An_format()
  63. log.info("\n--- 实验4:'An'格式演示 ---")
  64. -- 'A' 格式 - 打包第一个参数的整个字符串
  65. local str_data_A = pack.pack('A', "hezhou", "LuatOS")
  66. log.info("'A'格式打包:", str_data_A:toHex())
  67. log.info("'A'格式结果:", str_data_A)
  68. -- 'A5' 格式 - 打包前5个字符串参数
  69. local str_data_A5 = pack.pack('A5', "he", "zhou", "LuatOS", "!", "!")
  70. log.info("'A5'格式打包:", str_data_A5:toHex())
  71. log.info("'A5'格式结果:", str_data_A5)
  72. end
  73. -- 指定位置解包演示
  74. local function demo_position_unpack()
  75. log.info("\n--- 实验5:指定位置解包 ---")
  76. -- 打包多个数据
  77. local multi_data = pack.pack("<hIh", 100, 200, 300)
  78. log.info("多数据打包:", multi_data:toHex())
  79. -- 从指定位置开始解包
  80. local pos, val1 = pack.unpack(multi_data, "<h", 1) -- 从位置1开始解包
  81. local pos, val2 = pack.unpack(multi_data, "<I", pos) -- 从上次结束位置开始
  82. local pos, val3 = pack.unpack(multi_data, "<h", pos) -- 继续解包
  83. log.info("分步解包结果:", val1, val2, val3)
  84. end
  85. -- 复杂数据组合演示
  86. local function demo_complex_data()
  87. log.info("\n--- 实验6:复杂数据组合 ---")
  88. -- 打包复杂数据结构
  89. local complex_data = pack.pack(">H a h", 0x1234, "Test", -50)
  90. log.info("复杂数据打包:", complex_data:toHex())
  91. -- 解包复杂数据
  92. local _, header, text, value = pack.unpack(complex_data, ">H a h")
  93. log.info("复杂数据解包:", string.format("0x%04X", header), text, value)
  94. end
  95. -- 边界情况演示
  96. local function demo_edge_cases()
  97. log.info("\n--- 实验7:边界情况 ---")
  98. -- 打包空数据
  99. local empty_data = pack.pack("")
  100. log.info("空格式打包:", empty_data:toHex())
  101. -- 解包空数据
  102. local pos_empty = pack.unpack("", "")
  103. log.info("空格式解包位置:", pos_empty)
  104. -- 数值边界测试
  105. local max_short = pack.pack("<h", 32767)
  106. local min_short = pack.pack("<h", -32768)
  107. log.info("短整型边界 - 最大值:", max_short:toHex())
  108. log.info("短整型边界 - 最小值:", min_short:toHex())
  109. local _, max_val = pack.unpack(max_short, "<h")
  110. local _, min_val = pack.unpack(min_short, "<h")
  111. log.info("边界值验证:", max_val, min_val)
  112. end
  113. -- 运行所有演示
  114. local function run_all_demos()
  115. log.info("=== pack.pack 和 pack.unpack API 演示开始 ===")
  116. init()
  117. demo_endian()
  118. demo_mixed_types()
  119. demo_string_formats()
  120. demo_An_format()
  121. demo_position_unpack()
  122. demo_complex_data()
  123. demo_edge_cases()
  124. log.info("=== pack API 演示完成 ===")
  125. end
  126. -- 主任务函数
  127. local function main()
  128. log.info("pack_demo", "开始运行pack API演示")
  129. run_all_demos()
  130. log.info("pack_demo", "演示运行完毕")
  131. end
  132. -- 启动演示任务
  133. sys.taskInit(main)