You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AS3环境下Socket通信的纵向冗余校验(LRC)计算求助

AS3 LRC计算错误修正方案

问题背景

我需要向Socket发送格式为<STX>PIPE_DELIMITED_MESSAGE<ETX><LRC>的消息,其中:

  • STX = String.fromCharCode(02)(已正确实现)
  • ETX = String.fromCharCode(03)(已正确实现)
  • LRC 无法正确计算,相关资料较少

LRC计算规则:对**从STX之后的第一个字节开始,到ETX(包含ETX)**的所有字节进行8位异或(无进位二进制加法)运算的结果。

我使用的AS3函数如下,但计算结果不正确:

function generate_lrc(string: String) {
    var lrc = 0
    var text = string.split('');
    for (var i: Number = 0; i < text.length; i++) {
        lrc ^= text[i].charCodeAt(0);
    }
    trace('lrc = ' + lrc);
    return lrc;
}

问题分析

当前函数的问题在于:它对传入的整个字符串进行异或运算,包含了开头的STX和可能存在的结尾LRC,完全不符合规则中“从STX后第一个字节到ETX(含ETX)”的范围要求。

修正后的实现

function generate_lrc(fullMessage: String): int {
    var lrc: int = 0;
    const ETX: String = String.fromCharCode(03);
    // 定位ETX的位置
    var etxIndex: int = fullMessage.indexOf(ETX);
    
    // 边界校验:确保消息包含ETX
    if (etxIndex == -1) {
        trace("错误:消息中未找到ETX标识");
        return 0;
    }
    
    // 遍历范围:跳过STX(索引0),从索引1到ETX的索引(包含ETX)
    for (var i: int = 1; i <= etxIndex; i++) {
        lrc ^= fullMessage.charCodeAt(i);
    }
    
    // 确保结果为8位无符号整数(截断高位)
    lrc &= 0xFF;
    
    trace('lrc = ' + lrc);
    return lrc;
}

关键优化点

  • 范围精准:严格按照规则,只计算STX之后到ETX的字节,排除STX本身
  • 边界处理:增加ETX不存在的错误检测,避免无效计算
  • 8位约束:通过& 0xFF确保结果落在0-255的8位范围内,符合LRC的定义

内容的提问来源于stack exchange,提问作者Speego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:50:03