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

