${ctx}

${CTX} 与${pageContext.request.contextPath}的对比

1、${pageContext.request.contextPath}是获取当前根目录。

2、${ctx}通过观察可以知道也是获取当前根目录的意思

不同之处: 
${ctx}是 ${pageContext.request.contextPath}的简写版。 
同时发现在项目的index.jsp文件内有这样一段话的配置,

<c:set var="ctx" value="${pageContext.request.contextPath}"/>

在此值得注意的是,在使用${ctx}的时候一定不要忘记把带有该配置的的文件引入到当前页面来。

另外,${ctx}在jsp中可以直接识别, 放在js代码里会变成字符串

解决办法:

var contextPath = "${ctx}";

/** * @brief MQTT协议解析状态机 * @param q 循环队列指针,存储待解析的原始字节流 * @param ctx 解析上下文,保存解析过程中的中间状态 * @return 解析结果状态码: * NEED_MORE(需更多数据) | PARSE_ERROR(协议错误) | PARSE_COMPLETE(解析完成) * @note 基于MQTT 3.1.1协议规范实现[^1] */ int mqtt_parse(CircularQueue *q, ParseContext *ctx) { int i; uint8_t fixed_header; uint8_t byte; uint8_t data[128]; while (Queue_Count(q) > 0) // 循环处理队列中的字节 { switch (ctx->state) // 状态机核心逻辑 { case PARSE_HEADER: // 阶段1: 解析固定头 { /* 固定头长度验证 */ if (Queue_Count(q) < 1) return NEED_MORE; // 数据不足时立即返回 /* 提取报文类型: $type = (fixed\_header \gg 4)$ */ fixed_header = DeQueue(q); ctx->packet_type = fixed_header >> 4; /* 验证报文类型有效性: $1 \leq type \leq 15$ */ if (ctx->packet_type < 1 || ctx->packet_type > 15) { return PARSE_ERROR; // 非法类型触发错误 } /* 初始化剩余长度解析状态 */ ctx->state = PARSE_LENGTH; ctx->multiplier = 1; // 乘数初始化为$128^0=1$ ctx->remaining_len = 0; // 剩余长度归零 ctx->len_bytes = 0; // 已处理的长度字节数 break; } case PARSE_LENGTH: // 阶段2: 解析可变长度头 { byte = DeQueue(q); /* 剩余长度计算公式: $L_i = L_{i-1} + (b_i \& 0x7F) \times multiplier$ */ ctx->remaining_len += (byte & 0x7F) * ctx->multiplier; ctx->multiplier *= 128; // 乘数更新为$128^{i+1}$ ctx->len_bytes++; // 已处理字节数递增 /* 终止条件: $b_i \& 0x80 = 0$ */ if (!(byte & 0x80)) { ctx->state = PARSE_PAYLOAD; // 进入载荷解析阶段 } else if (ctx->len_bytes >= 4) { return PARSE_ERROR; // 长度超过4字节限制 } break; } case PARSE_PAYLOAD: // 阶段3: 解析有效载荷 { /* 验证载荷完整性: $QueueCount \geq remaining\_len$ */ if (Queue_Count(q) < ctx->remaining_len) { return NEED_MORE; // 等待完整载荷到达 } /* 提取载荷数据并处理 */ for (i = 0; i < ctx->remaining_len; i++) { data[i] = DeQueue(q); // 逐个字节出队 } printf("\n\n\n\n"); for (i = 0; i < 128; i++) { printf("%02X ", data[i]); } Aliyun_Iot(data); // 示例: 调用阿里云IoT处理函数 return PARSE_COMPLETE; // 完成整个报文解析 } } } return NEED_MORE; // 队列处理完毕但未完成解析 }这段代码怎么把固定头和剩余长度一起保存到buffer数组
最新发布
05-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

We Never say die

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值