ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AnyPS5如何复刻PS5时间与随机数?libSceRtc与libSceRandom完全拆解

AnyPS5如何复刻PS5时间与随机数?libSceRtc与libSceRandom完全拆解 AnyPS5如何复刻PS5时间与随机数libSceRtc与libSceRandom完全拆解【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5AnyPS5 是一款将 PS5 可执行文件自动移植到 Linux 和 Windows 的开源工具它不做模拟而是直接实现 PS5 系统库供原生代码动态链接。本文将完整拆解其中两个基础系统库libSceRtc时间与libSceRandom随机数的实现原理带你看看复刻系统行为到底要做到什么程度。为什么时间与随机数是移植的基石游戏和主机系统在以下场景会依赖这两个库⏰ 存档时间戳、活动倒计时、成就记录 联网功能中的 RFC 3339 时间字符串2024-02-29T12:34:56.78Z这种格式 抽奖、随机事件、加盐校验等需要真随机源的地方PS5 的时间 API 基于sceRtc*系列函数随机数基于sceRandomGetRandomNumber。AnyPS5 的 core/libs/prx 目录为每个系统库单独建目录实现时间与随机数的实现分别位于 libSceRtc/Export.cpp 和 libSceRandom/Export.cpp。libSceRtcTick 时间模型与日历换算核心抽象一切时间都是tickPS5 的 RTC 用 64 位 tick 表示时间1 秒 1,000,000 tick微秒级。所有接口——加减秒/天/月/年、取当前时间——都围绕RtcTick和RtcDateTime两个结构展开定义在 SceTypes.hppRtcDateTime年、月、日、时、分、秒、微秒可读结构RtcTick一个 64 位整数机器友好的内部表示实现里最关键的换算是 daysFromCivil / civilFromDays——纯数学的公历 ↔ 天数算法不依赖任何平台库因此在 Linux 和 Windows 上结果完全一致。获取当前时间一行 C 标准库搞定// 取系统微秒时间戳加上从 PS5 tick 纪元到 Unix 纪元的偏移 tick UNIX_EPOCH_TICK system_clock 当前微秒数这就是 currentTick 的全部逻辑用宿主系统的真实时钟套上 PS5 的纪元偏移。sceRtcGetCurrentTick与sceRtcGetCurrentNetworkTick共用同一实现——移植版不做网络时间同步。时区与多格式互转AnyPS5 完整实现了这一族接口能力对应函数说明UTC ↔ 本地时间sceRtcConvertUtcToLocalTime时区偏移通过宿主localtime反推见 localOffsetSecondsRFC 3339 格式化sceRtcFormatRFC3339输出Z或±HH:MM时区后缀RFC 3339 解析sceRtcParseRFC3339严格校验时区小时 ≤23、分钟 ≤59非法后缀直接拒绝Unix 秒互转sceRtcGetTime_t/sceRtcSetTime_t与 POSIX 生态互通Windows 文件时间sceRtcGetWin32FileTime100 纳秒/单位兼容 NTFS 时间戳特别值得称道的是闰年与边界处理sceRtcTickAddMonths会把 1 月 31 日加一个月安全钳制到 2 月 29 日闰年加月份、加减 tick 时都会做溢出检查超界返回0x80B50003非法值错误码与真机的错误码体系逐位对齐。libSceRandom用 C 标准库复刻真随机随机数库的实现极其精简核心只有一个函数 sceRandomGetRandomNumber参数校验缓冲区为空或超过 64 字节上限时返回错误码0x817C0016且不破坏输入缓冲区内容随机源使用线程局部的std::random_device按 4 字节一段填充——在 Linux 上最终来自内核熵源在 Windows 上来自系统 CSPRNG保证跨平台都是真随机部分填充请求 7 字节时第 8 字节及之后保持原值不变对比真机 API 的单次最多 64 字节限制这是典型的行为等价实现不是抄 PS5 硬件的熵源而是保证可观察行为一致。用 200 行测试保证复刻得一模一样AnyPS5 为每个库配了对应的客制测试这才是复刻质量的关键保障GuestRtc.cpp200 行断言覆盖闰年判定2000 是闰年、1900 不是、2024-02-29 闰日的 tick 精确值、RFC 3339 全部非法时区后缀、tick 溢出边界MAX_TICK 1必须报错GuestRandom.cpp验证空指针、65 字节超限、7 字节非对齐填充以及两次 64 字节输出必然不同测试构建与注册在 libSceRtc/CMakeLists.txt 中开启BUILD_TESTING后自动编译guest_rtc_tests并注册到 CTestWindows 上还会把新编译的库目录前置到 PATH确保测的是刚构建的库而不是旧版本。快速上手构建 AnyPS5 体验 PS5 移植如果你想亲手体验这套移植工具链git clone https://gitcode.com/GitHub_Trending/an/AnyPS5 cd AnyPS5按 docs/dev/BUILD.md 配置 CMake 构建建议开启BUILD_TESTING先跑一遍guest_rtc、guest_random测试用 relinker 转换可执行文件输入输出用法见 docs/user/USAGE.mdrelinker source/input.elf app.elf # Linux 输出 relinker --windows source/input.elf app.exe # Windows 输出转换后的程序在 Linux/Windows 上直接运行动态链接到 AnyPS5 编译出的 libSceRtc 等系统库——时间、随机数等基础能力即插即用无需任何模拟器进程。关键文件索引文件作用core/libs/prx/libSceRtc/Export.cppPS5 时间系统完整实现日历、tick、时区、RFC 3339core/libs/prx/libSceRandom/Export.cpp随机数 API 实现core/libs/tests/GuestRtc.cpp时间库行为等价性测试core/libs/tests/GuestRandom.cpp随机数库边界测试core/libs/SceTypes.hppRtcDateTime/RtcTick结构定义docs/user/USAGE.mdrelinker 移植工具使用说明总结AnyPS5 对时间与随机数的复刻展示了无模拟移植的核心思路用宿主标准能力C 时钟、random_device重建 PS5 API 的可观察行为用逐位对齐的错误码和海量边界测试保证兼容性。这两块虽然代码量不大却是整个 core/libs/prx 系统库矩阵的地基——有了正确的时间源和随机源存档、联网、成就等上层功能才能逐层搭建起来。【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表