|
发表于 2025-7-9 13:20:16
|
显示全部楼层
河北省张家口市

.版本 2 .支持库 spec .支持库 dp1 .子程序 MessagePack解码器 .参数 data, 字节集 .局部变量 pos, 整数型 .局部变量 length, 整数型 .局部变量 result, 通用型 pos = 1 length = 取字节集长度 (data) result = 解码值 (data, pos, length) 返回 (result) .子程序 解码值 .参数 data, 字节集 .参数 pos, 整数型, 参考 .参数 length, 整数型 .局部变量 format_byte, 字节型 .局部变量 size, 整数型 .局部变量 result, 通用型 .如果真 (pos > length) 返回 ("数据意外结束") .如果真结束 format_byte = 取字节集数据 (取字节集中间 (data, pos, 1), #字节型) pos = pos + 1 .判断开始 (format_byte ≤ 127) ' 正固定整数 返回 (format_byte) .判断 (format_byte ≥ 224) ' 负固定整数 返回 (format_byte - 256) .判断 (format_byte = 192) ' nil 返回 (空) .判断 (format_byte = 194) ' false 返回 (假) .判断 (format_byte = 195) ' true 返回 (真) .判断 (format_byte = 202) ' float32 返回 (取字节集数据 (取字节集中间 (data, pos, 4), #小数型) pos = pos + 4 .判断 (format_byte = 203) ' float64 返回 (取字节集数据 (取字节集中间 (data, pos, 8), #双精度小数型) pos = pos + 8 .判断 (format_byte ≥ 160 且 format_byte ≤ 191) ' 固定字符串 size = format_byte 位与 31 result = 取字节集中间 (data, pos, size) pos = pos + size 返回 (到文本 (result)) .判断 (format_byte ≥ 144 且 format_byte ≤ 159) ' 固定数组 size = format_byte 位与 15 返回 (解码数组 (data, pos, length, size)) .判断 (format_byte ≥ 128 且 format_byte ≤ 143) ' 固定映射 size = format_byte 位与 15 返回 (解码映射 (data, pos, length, size)) .默认 ' 其他类型处理... 返回 ("未知格式字节: " + 取十六进制文本 (format_byte)) .判断结束 .子程序 解码数组 .参数 data, 字节集 .参数 pos, 整数型, 参考 .参数 length, 整数型 .参数 size, 整数型 .局部变量 result, 数组 .局部变量 i, 整数型 .局部变量 value, 通用型 重定义数组 (result, 假, size) .计次循环首 (size, i) value = 解码值 (data, pos, length) 加入成员 (result, value) .计次循环尾 () 返回 (result) .子程序 解码映射 .参数 data, 字节集 .参数 pos, 整数型, 参考 .参数 length, 整数型 .参数 size, 整数型 .局部变量 result, 文本型 .局部变量 i, 整数型 .局部变量 key, 通用型 .局部变量 value, 通用型 result = "{" .计次循环首 (size, i) key = 解码值 (data, pos, length) value = 解码值 (data, pos, length) .如果 (i > 1) result = result + "," .否则 result = result + "" .如果结束 result = result + 到文本 (key) + ":" + 到文本 (value) .计次循环尾 () result = result + "}" 返回 (result) .子程序 解密 .参数 data, 文本型 .局部变量 cleaned_data, 文本型 .局部变量 i, 整数型 .局部变量 c, 文本型 .局部变量 decoded_bytes, 字节集 .局部变量 result, 文本型 ' 1. 清理非base64字符 cleaned_data = "" .计次循环首 (取文本长度 (data), i) c = 取文本中间 (data, i, 1) .如果真 (寻找文本 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", c, , 假) > 0) cleaned_data = cleaned_data + c .如果真结束 .计次循环尾 () ' 添加padding如果需要 .判断循环首 (取文本长度 (cleaned_data) % 4 ≠ 0) cleaned_data = cleaned_data + "=" .判断循环尾 () ' 2. Base64解码 .如果真 (Base64解码 (cleaned_data, decoded_bytes) = 假) 返回 (格式化文本 ("{\"error\":\"Base64解码失败\",\"raw_data\":\"%s\"}", data)) .如果真结束 ' 3. 尝试MessagePack解码 result = MessagePack解码器 (decoded_bytes) .如果真 (是否为空 (result)) ' 尝试直接解析为字符串 .如果真 (是否文本型 (decoded_bytes)) 返回 (格式化文本 ("{\"text\":\"%s\"}", 到文本 (decoded_bytes))) .否则 返回 (格式化文本 ("{\"hex\":\"%s\",\"error\":\"解码失败\"}", 字节集_到十六进制 (decoded_bytes))) .如果真结束 .如果真结束 返回 (result) |
|