Delphi实现C#按位取反(~运算符):串口校验和函数移植
串口校验和函数从C#移植到Delphi(Windows/Android)
我来帮你补全这段Delphi的校验和计算逻辑,同时确保它能在Windows和Android平台正常运行——其实Delphi在这两个平台上的字节位运算逻辑是一致的,不用额外做适配~
先回顾下C#原函数的核心逻辑:先对指定范围内的字节累加求和,然后对求和结果按位取反,加1(也就是求补码),最后通过& 0xFF确保结果是单字节无符号值。
补全后的完整Delphi函数
function CalcCheckSum(buffer: TArray<Byte>; nStartPos: Integer; nLen: Integer): Byte; var i: Integer; begin Result := 0; // 用for循环更符合Delphi编码习惯,也可以保留原while写法 for i := nStartPos to nStartPos + nLen - 1 do begin Result := Result + buffer[i]; end; // 对应C#的 ((~btSum) + 1) & 0xFF Result := Byte(not Result) + 1; end;
关键逻辑说明
- 按位取反:C#中
~btSum会把无符号byte提升为int类型,取反后需要& 0xFF截断回8位;而Delphi中not Result(Result是Byte类型)会返回Integer,我们直接用Byte(not Result)强制转换回8位无符号字节,效果和C#的~btSum & 0xFF完全一致。 - 加1求补:直接执行
+1操作,因为Byte类型本身是8位,溢出会自动截断,不用额外做与运算。 - 平台适配:Delphi的
TArray<Byte>在Windows和Android平台的内存布局、字节操作逻辑完全相同,所以这个函数无需做任何平台差异化修改,直接就能在两个平台上正常工作。
可选优化(保持原while循环写法)
如果你更习惯保留原代码的while循环结构,补全后的版本是:
function CalcCheckSum(buffer: TArray<Byte>; nStartPos: Integer; nLen: Integer): Byte; var i: Integer; begin Result := 0; i := nStartPos; while i < nStartPos + nLen do begin Result := Result + buffer[i]; Inc(i); end; Result := Byte(not Result) + 1; end;
内容的提问来源于stack exchange,提问作者Freddie Bell
相关产品推荐
相关产品推荐

