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

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;

关键逻辑说明

  1. 按位取反:C#中~btSum会把无符号byte提升为int类型,取反后需要& 0xFF截断回8位;而Delphi中not Result(Result是Byte类型)会返回Integer,我们直接用Byte(not Result)强制转换回8位无符号字节,效果和C#的~btSum & 0xFF完全一致。
  2. 加1求补:直接执行+1操作,因为Byte类型本身是8位,溢出会自动截断,不用额外做与运算。
  3. 平台适配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:13