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

如何将Integer转换为同等字节大小的Packed Record布尔类型记录?

解决方案(适用于Delphi/Free Pascal环境)

你要实现等长内存类型的互转,不需要专门的转换函数,有三种成熟的实现方案:

  • 方案1:用absolute关键字做内存别名(最简单,适合临时转换场景)
    直接将整数变量和记录变量绑定到同一块内存地址,赋值后自动同步状态,无需额外拷贝:
    var
      RightsInt: Integer;
      UserRights: TUserRightsRecord absolute RightsInt;
    begin
      RightsInt := 你的整数值;
      // 直接访问UserRights.r1 ~ UserRights.r32即可拿到对应位的布尔值
    end;
    
  • 方案2:用Move函数做内存拷贝(通用方案,支持任意等长类型转换)
    手动拷贝内存内容,适合需要独立存储两个变量的场景:
    var
      RightsInt: Integer;
      UserRights: TUserRightsRecord;
    begin
      RightsInt := 你的整数值;
      Move(RightsInt, UserRights, SizeOf(Integer));
      // 此时UserRights的字段已同步为整数对应位的布尔值
    end;
    
  • 方案3:定义变体记录(最适合业务封装场景)
    直接修改记录定义,内置整数访问入口,不需要额外转换操作:
    TUserRightsRecord = packed record
      case Integer of
        0: (
          r1, r2, r3, r4, r5, r6, r7, r8,
          r9, r10, r11, r12, r13, r14, r15, r16,
          r17, r18, r19, r20, r21, r22, r23, r24,
          r25, r26, r27, r28, r29, r30, r31, r32: Boolean
        );
        1: (AsInteger: Integer);
    end;
    
    使用时直接操作AsInteger字段即可:
    var
      UserRights: TUserRightsRecord;
    begin
      UserRights.AsInteger := 你的整数值;
      // 直接访问布尔字段即可
    end;
    

注意:x86/x86_64环境为小端序,记录中第一个布尔字段r1对应整数的最低位(第0位),最后一个字段r32对应整数的最高位(第31位),如果业务需要位序相反,赋值前先对整数做位序反转即可。
额外提示:如果你的TUserRightsRecord中每个布尔值是占1位而非1字节,需要将字段定义为位字段,上面的三种方案依然适用,只需保证记录的SizeOf结果和Integer一致(4字节)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:09:00