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
相关产品推荐
相关产品推荐

