AssetStudio深度解析:Unity资源提取原理与跨版本兼容实践

news2026/5/22 2:46:53
1. 这不是个“点开即用”的工具而是一把需要校准的Unity资源解剖刀AssetStudio这个名字听起来像某个轻量级小工具但实际用过的人很快会意识到它根本不是拿来就跑的“一键提取器”而是一套需要你亲手调参、理解Unity底层序列化机制、甚至要对着二进制结构反推逻辑的资源解剖系统。我第一次用它从一个加密UI包里导出贴图时连续三小时卡在“NullReferenceException at AssetStudioGUI.MainWindow.LoadAssets”——不是软件崩了是它加载的Bundle里混进了Unity 2019.4.31f1用ScriptableRenderPipeline生成的CustomRenderTexture而AssetStudio默认不识别这个类型。后来翻源码才发现它对Unity版本的兼容性不是靠自动检测而是靠硬编码的TypeTree签名匹配表差一个小版本号整个资源树就塌一半。关键词里“终极指南”四个字恰恰说明这不是入门教程而是给已经摔过跟头的人准备的复盘手册。“Unity资源提取”背后藏着三个真实痛点一是资源加密与混淆比如用AssetBundle加密Lua字符串异或二是跨版本兼容断层5.x到2021.x的SerializedFile格式变化达7处关键字段偏移三是依赖链断裂一个TextAsset引用了另一个未导出的ScriptableObject导致导出后脚本逻辑全空。而“一键安装配置”更是个误导性说法——真正的“一键”是你把AssetStudio源码编译成适配自己项目Unity版本的定制版再配合PowerShell脚本自动注入TypeTree定义最后用JSON Schema校验导出结果完整性。这整套流程才是业内老手真正落地的“一键”。这篇文章写给三类人正在逆向竞品App资源结构的客户端工程师需要从老旧Unity工程中抢救美术资产的外包团队以及被策划临时塞来“把那个iOS包里的粒子特效扒出来改个颜色”的TA。它不讲怎么双击exe运行而是带你从.NET反编译AssetStudio主程序开始看清楚它如何解析SerializedFile Header、如何重建ObjectInfo索引、为什么AssetBundleManifest必须和Bundle同目录才能正确解析依赖——所有这些都直接决定你导出的Shader是否能编译、AnimationClip帧数据是否错位、甚至AnimatorController状态机连线是否完整。如果你只想要个傻瓜式工具这篇指南可能让你失望但如果你已经试过五种不同版本的AssetStudio、导出过37个失败的Prefab、在ILSpy里逐行比对过AssetStudio.Core.dll的LoadFromMemory方法那接下来的内容就是你缺了半年的那块拼图。2. AssetStudio核心机制拆解它到底在读什么、怎么读、为什么读错2.1 SerializedFileUnity资源文件的“DNA双螺旋结构”AssetStudio所有操作的起点是Unity序列化文件SerializedFile——它不是普通二进制流而是一套分层嵌套的元数据容器。你可以把它想象成一本带索引的古籍封面Header写着总页数、纸张材质Unity版本、装订方式Endianness目录FileHeader列出所有章节名ObjectInfo及其起始页码Offset正文ObjectData则按章节顺序排列每章开头有独立小标题ClassID ScriptID和内容长度ByteLength。AssetStudio第一步就是精准定位这三个区域而它的失败90%源于Header解析错误。举个真实案例某Unity 2020.3.35f1项目导出的AssetBundle其FileHeader中m_MetadataSize字段值为0x1A8424字节但AssetStudio 0.16.5默认按Unity 2019.4的结构体布局去读把第420-423字节误判为m_FileSize导致后续所有ObjectInfo的Offset计算偏移4字节最终加载时所有GameObject的Transform组件全部丢失。这个问题在AssetStudio源码的SerializedFile.cs第217行暴露得非常清晰// AssetStudio 0.16.5 原始代码错误 if (unityVersion new Version(2019.4)) m_MetadataSize reader.ReadUInt32(); else m_MetadataSize reader.ReadUInt32(); // 实际应为UInt64Unity 2020.1起m_MetadataSize升级为UInt64但AssetStudio没同步更新读取逻辑。解决方案不是换新版本0.17.0仍存在同样问题而是手动修改源码在SerializedFile.ReadHeader()方法中插入版本判断分支if (unityVersion new Version(2020.1)) m_MetadataSize reader.ReadUInt64(); else if (unityVersion new Version(2019.4)) m_MetadataSize reader.ReadUInt32(); else m_MetadataSize reader.ReadUInt32();提示不要试图用Hex Editor手动修正Bundle文件——SerializedFile的校验和CRC32存储在Header末尾任何字节修改都会触发AssetStudio的完整性校验失败。必须从源码层修复读取逻辑。2.2 TypeTreeUnity类型的“基因图谱”决定你能看到什么如果说SerializedFile是书的物理结构TypeTree就是这本书的语法体系。Unity每个类如MeshRenderer、AudioSource在序列化时并非直接存字段值而是存一套类型描述树根节点是类名子节点是字段名类型数组维度偏移量。AssetStudio能否正确显示一个GameObject的所有组件完全取决于它是否拥有该类的TypeTree定义。问题在于Unity官方从不公开TypeTree的完整规范AssetStudio的TypeTree数据库来自社区逆向贡献存在大量缺失。例如Unity 2021.3新增的VFX Graph资源其核心类VisualEffect的TypeTree在AssetStudio 0.17.0中完全空白导致导入后显示为“Unknown Object”。此时你需要手动补全TypeTree步骤如下用Unity 2021.3打开原始工程创建空场景添加一个VFX Graph在Inspector面板右键点击VFX Graph组件 → “Copy Component”新建文本文件粘贴内容找到类似m_ExportedProperties: []的区块将其中type: VisualEffect及所有嵌套字段如m_SimulationWidth,m_SimulationHeight按AssetStudio要求的JSON格式重写{ m_Type: VisualEffect, m_Version: 0, m_Fields: [ { m_Name: m_SimulationWidth, m_Type: int, m_Offset: 0 }, { m_Name: m_SimulationHeight, m_Type: int, m_Offset: 4 }, { m_Name: m_Asset, m_Type: PPtrVisualEffectAsset, m_Offset: 8 } ] }将JSON保存为VisualEffect.treetype放入AssetStudio安装目录的TypeTrees子文件夹重启AssetStudio重新加载Bundle。注意TypeTree的m_Offset不是C#字段偏移而是Unity序列化器内部计算的字节偏移。对于引用类型如PPtr实际存储的是一个4字节整数指向ObjectInfo索引而非内存地址。很多新手在此处填错偏移量导致导出后引用全为空。2.3 AssetBundle依赖解析你以为的“单文件”其实是张网AssetStudio的“Extract All”按钮之所以常导出一堆空文件根源在于它对AssetBundle依赖关系的理解过于理想化。Unity的依赖管理分三层物理层Bundle A通过bundle.LoadAsset(xxx.prefab)加载Bundle B中的资源逻辑层Bundle B中的Prefab引用了Bundle C中的Texture构建层Unity Build Pipeline将Bundle C打包进Bundle A的assetBundleNames列表但AssetStudio默认只扫描当前加载Bundle的Header不会主动去磁盘搜索同名Bundle。实测发现当AssetStudio加载Bundle A时若Bundle C不在同一目录或未被显式加载它会将所有对Bundle C的引用标记为MissingObject导出的Prefab中Material字段全为null。解决方案不是把所有Bundle扔进一个文件夹这会引发命名冲突而是用AssetStudio的“Dependency View”功能手动补全加载Bundle A后点击顶部菜单“View → Dependency View”在弹出窗口中右键点击标红的MissingObject→ “Find in Folder...”选择Bundle C所在目录AssetStudio会自动解析其Header并建立引用映射此时再执行“Extract All”Prefab中的Material将正确关联到Bundle C导出的Texture。这个过程揭示了一个关键事实AssetStudio的依赖解析是被动响应式而非主动遍历式。它不会像Unity Editor那样扫描整个StreamingAssets目录而是严格遵循你当前加载的Bundle所声明的依赖路径。这也是为什么很多团队在发布前用AssetStudio做资源审计时必须确保所有相关Bundle已预加载——否则漏检率高达60%以上。3. 真正的“一键安装配置”从源码编译到自动化流水线3.1 为什么必须自己编译官方Release版的三大硬伤AssetStudio官方GitHub Release页面提供的exe文件本质是.NET Framework 4.7.2编译的WinForms应用存在三个无法绕过的生产环境缺陷缺陷类型具体表现影响范围修复方案Unity版本硬编码TypeTree数据库仅覆盖至Unity 2020.3对2021.3新增的URP ShaderGraph、DOTS ECS组件完全无定义所有使用新版渲染管线的项目修改TypeTreeManager.cs动态加载外部JSON定义内存泄漏加载超大Bundle2GB时AssetStudioGUI.MainWindow.LoadAssets()方法未释放MemoryStream导致GC无法回收大型开放世界游戏资源提取在LoadAssets()末尾添加stream?.Dispose()路径编码错误使用Encoding.Default读取中文路径Bundle导致System.IO.DirectoryNotFoundException中文Windows系统用户占比超75%的国内团队替换为Encoding.UTF8并重写File.ReadAllBytes调用我曾用官方0.17.0版处理《原神》PC端1.6版本的UI Bundle2.3GB在导出第17个Atlas时进程内存飙升至8.2GB最终OOM崩溃。而编译后的定制版全程内存占用稳定在1.4GB以内——差异就来自那行stream?.Dispose()。编译流程本身并不复杂但需注意.NET SDK版本陷阱AssetStudio主项目要求.NET Framework 4.7.2但其子模块AssetStudioCore已迁移到.NET Standard 2.0。若你本地安装的是.NET 6 SDKVisual Studio会默认用dotnet build命令导致AssemblyResolve事件无法捕获Framework引用。正确做法是卸载所有.NET SDK仅保留.NET Framework 4.7.2 Developer Pack用Visual Studio 2019打开.sln文件VS2022对旧Framework支持不稳定在解决方案资源管理器中右键AssetStudioCore项目 → “属性” → “应用程序”选项卡 → 确认目标框架为“.NET Standard 2.0”右键AssetStudioGUI项目 → “属性” → “应用程序”选项卡 → 目标框架改为“.NET Framework 4.7.2”关键一步在AssetStudioGUI项目的“引用”中删除所有灰色警告项右键“添加引用” → “程序集” → 手动勾选System.Drawing.Common、System.Windows.Forms等Framework核心库。提示编译后生成的AssetStudioGUI.exe体积会比官方版大12MB这是因为嵌入了System.Text.Json替代原Newtonsoft.Json避免JSON解析时的JsonReaderException。这是AssetStudio社区公认的稳定性提升方案。3.2 PowerShell自动化配置让“一键”真正落地所谓“一键安装配置”在工业级实践中是指用PowerShell脚本完成三件事环境检测、依赖注入、校验部署。以下是我为某MMO项目组定制的Setup-AssetStudio.ps1核心逻辑# 检测.NET Framework 4.7.2是否安装 $netVersion Get-ItemProperty HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Release -ErrorAction SilentlyContinue if ($netVersion -lt 461808) { Write-Error 请先安装 .NET Framework 4.7.2 exit 1 } # 自动下载并解压TypeTree扩展包含Unity 2021.3 URP/HDRP定义 Invoke-WebRequest -Uri https://github.com/Perfare/AssetStudio/releases/download/v0.17.0/TypeTrees.zip -OutFile $PSScriptRoot\TypeTrees.zip Expand-Archive -Path $PSScriptRoot\TypeTrees.zip -DestinationPath $PSScriptRoot\TypeTrees -Force # 注入自定义TypeTree公司私有Shader Copy-Item $PSScriptRoot\CustomShaders.treetype $PSScriptRoot\TypeTrees\ -Force # 生成配置文件强制指定Unity版本 $Config { UnityVersion 2021.3.15f1 AutoLoadDependencies $true ExportFormat prefab SkipMissingObjects $false } $Config | ConvertTo-Json | Out-File $PSScriptRoot\config.json -Encoding UTF8 # 启动AssetStudio并加载配置 Start-Process $PSScriptRoot\AssetStudioGUI.exe -ArgumentList --config$PSScriptRoot\config.json这个脚本的价值在于它把原本需要人工确认的5个步骤检查.NET、下载TypeTree、复制私有定义、创建config.json、启动程序压缩为单次执行。更重要的是--config参数让AssetStudio启动时自动加载指定Unity版本跳过耗时的版本探测——实测将大型Bundle加载时间从47秒缩短至19秒。注意PowerShell脚本必须以管理员权限运行否则无法写入Program Files目录。但更推荐将AssetStudio部署在用户目录如$env:USERPROFILE\AssetStudio避免权限问题。我在某项目中因坚持部署到C:\Program Files导致CI服务器因UAC限制无法自动执行脚本延误了三天资源审计。3.3 CI/CD集成把资源提取变成每日构建环节真正的“终极”配置是让AssetStudio成为CI流水线的一环。我们为某SLG手游搭建的Jenkins Pipeline如下pipeline { agent any stages { stage(Extract UI Assets) { steps { script { // 从Git LFS拉取最新AssetBundle sh git lfs pull --includeAssets/UI/*.bundle // 调用定制版AssetStudio导出所有UI Prefab sh cd $WORKSPACE/AssetStudio ./AssetStudioCLI.exe \ --input $WORKSPACE/Assets/UI \ --output $WORKSPACE/Extracted/UI \ --format prefab \ --unity-version 2020.3.41f1 \ --skip-missing // 校验导出结果确保至少导出127个Prefab且无null引用 sh count\$(ls \$WORKSPACE/Extracted/UI/*.prefab 2/dev/null | wc -l) if [ \$count -lt 127 ]; then echo ERROR: UI Prefab导出数量不足127个 exit 1 fi grep -r m_Materials.*null \$WORKSPACE/Extracted/UI/ exit 1 || true } } } } }这里的关键创新是AssetStudioCLI.exe——它是基于AssetStudio源码改造的命令行版本移除了所有GUI依赖仅保留核心解析逻辑。编译时需修改Program.cs将Application.Run(new MainWindow())替换为var options ParseArgs(args); var extractor new AssetExtractor(options.InputPath, options.OutputPath); extractor.ExtractAll(); Console.WriteLine($Success: Extracted {extractor.ExtractedCount} assets);CLI模式使资源提取可纳入自动化测试每次构建后自动比对导出Prefab的m_Component数组长度与基线值偏差超过5%即触发告警。上线前两周这套机制提前发现了UI团队误删的3个核心Canvas组件避免了线上玩家进入主城即崩溃的事故。4. 高阶实战破解加密Bundle、修复损坏资源、跨平台提取4.1 应对Bundle加密从“无法加载”到“精准解密”当AssetStudio报错Invalid file header或Unable to read beyond the end of the stream大概率遇到加密Bundle。Unity本身不提供标准加密方案各团队实现五花八门但万变不离其宗——所有加密都作用于SerializedFile的Body部分Header通常明文以保证Unity能识别文件类型。破解思路分三步第一步定位加密区域用HxD Hex Editor打开Bundle搜索ASCII字符串unity3dSerializedFile Header标识记录其位置如0x100。然后观察Header后第一个ObjectInfo的m_PathID字段通常为0x00000000若该位置出现乱码如0x9A 0x3F 0x7E 0x12说明Body已被加密。第二步识别加密算法常见模式有三类XOR异或密钥长度≤4字节特征是加密后数据呈现周期性重复如每4字节一循环AES-CBC密钥长度16/24/32字节特征是加密后数据熵值极高Shannon熵7.9自定义混淆如字节位移查表替换特征是特定字节如0x00出现频率异常低。我处理过某二次元游戏的Bundle用ent工具计算其Body熵值为7.92锁定AES-CBC。密钥藏在Unity Player中用CFF Explorer打开Game.exe在.text段搜索AES字符串定位到AesManaged构造函数调用其第一个参数即为密钥十六进制字符串2B7E151628AED2A6ABF7158809CF4F3C。第三步编写解密脚本用Python实现AES-CBC解密需安装pycryptodomefrom Crypto.Cipher import AES from Crypto.Util.Padding import unpad def decrypt_bundle(input_path, output_path, key_hex): key bytes.fromhex(key_hex) iv b\x00 * 16 # 多数Unity项目用全零IV with open(input_path, rb) as f: data f.read() # 跳过Header通常0x100字节 header data[:0x100] body data[0x100:] cipher AES.new(key, AES.MODE_CBC, iv) decrypted_body unpad(cipher.decrypt(body), AES.block_size) with open(output_path, wb) as f: f.write(header decrypted_body) decrypt_bundle(encrypted.bundle, decrypted.bundle, 2B7E151628AED2A6ABF7158809CF4F3C)解密后Bundle即可被AssetStudio正常加载。但要注意某些项目会对SerializedFile的m_FileSize字段进行二次校验解密后需用Hex Editor修正该字段值位于Header偏移0x08处4字节小端序。经验不要尝试在AssetStudio源码中集成解密逻辑——这违反Unity EULA中关于“不得修改运行时行为”的条款。解密必须作为预处理步骤独立存在。4.2 修复损坏的SerializedFile当Header被截断时怎么办AssetStudio加载Bundle时报End of Stream往往不是文件损坏而是Header被意外截断。Unity Bundle的Header固定为0x100字节但某些CDN服务会因缓存策略截断小文件。修复方法是重建Header用file命令检测文件类型file broken.bundle若返回data而非Unity serialized file确认Header损坏创建新Header十六进制00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # m_FileSize占位 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # m_Version占位 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # m_MetadataSize占位 ...共256字节全部填0计算真实m_FileSizels -l broken.bundle | awk {print $5}转为小端序16进制如12345678 →49 96 02 D2填入Header偏移0x08处设置m_Version根据Bundle来源填入对应Unity版本号如2020.3.41f1 →0x00000000因Unity用内部ID保存新Header用cat header.bin broken.bundle fixed.bundle拼接。这个过程看似繁琐但比重下资源包快得多。我在某项目中用此法修复了17个被CDN截断的UI Bundle平均耗时2分14秒/个。4.3 跨平台提取在macOS/Linux上运行AssetStudioAssetStudio官方版仅支持Windows但Unity资源格式是跨平台的。解决方案是用.NET Core重写核心解析模块。我基于AssetStudioCore库开发了AssetStudioCLI的跨平台版本关键适配点文件路径处理Windows用\macOS/Linux用/需统一用Path.Combine()GUI依赖剥离移除所有System.Windows.Forms引用用Console.WriteLine替代日志输出字体渲染Linux缺少Microsoft Sans Serif改用DejaVu Sans需在Dockerfile中预装内存映射Windows用MemoryMappedFileLinux/macOS用mmap()系统调用。Docker部署脚本示例FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY . . RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/runtime-deps:6.0 RUN apt-get update apt-get install -y fonts-dejavu WORKDIR /app COPY --frombuild /app . CMD [./AssetStudioCLI, --input, /data/bundle, --output, /data/extracted]启动命令docker run -v $(pwd)/bundles:/data/bundle -v $(pwd)/extracted:/data/extracted assetstudio-cli。实测在M1 Mac上提取速度比Windows虚拟机快3.2倍——因为ARM64指令集对AES加密运算有原生优化。5. 避坑实录那些让资深工程师沉默的AssetStudio陷阱5.1 “Extract All”按钮的幻觉它根本不会导出所有东西几乎所有新手都会点“Extract All”然后惊讶地发现导出的Prefab里没有MeshFilter。真相是AssetStudio的“Extract All”只导出当前Bundle中直接包含的Object而Mesh资源通常被抽离到单独的Meshes.bundle中。它不会自动解析m_Mesh字段指向的PPtrMesh并去其他Bundle中加载。验证方法在AssetStudio中选中Prefab → 右键“View Object” → 查看m_Component数组中MeshFilter的m_Mesh字段若显示PPtrMesh (fileID: 0, guid: xxx, type: 0)且type: 0说明该Mesh不在当前Bundle中。此时必须记录guid值如a1b2c3d4e5f67890在项目所有Bundle中搜索该GUIDgrep -r a1b2c3d4e5f67890 *.bundle找到对应Bundle后用AssetStudio单独加载它再次执行“Extract All”此时Mesh将被正确导出。教训我曾为某AR项目导出127个Prefab上线后发现所有3D模型都是紫色Missing Shader追查发现Shader被放在Shaders.bundle中而该Bundle未被加载。修复耗时8小时只因没看懂PPtr的type字段含义。5.2 TypeTree版本错配为什么同一个Bundle在不同AssetStudio版本中显示不同AssetStudio的TypeTree匹配不是“精确匹配”而是“最近似匹配”。当你用AssetStudio 0.16.5加载Unity 2021.3的Bundle时它找不到VisualEffect定义就会退回到Object基类的TypeTree导致所有字段显示为m_UnknownData。而AssetStudio 0.17.0虽增加了部分2021.3定义但VisualEffectAsset的TypeTree仍不完整导致导出的VFX Graph中粒子发射器参数全为空。根本原因在于Unity的TypeTree在不同版本间存在字段增删和偏移重排。例如Unity 2020.3中Camera类的m_ClearFlags字段偏移为0x1C到2021.3变为0x20因新增了m_CameraStack字段。AssetStudio若用旧TypeTree解析新Bundle就会把m_CameraStack的数据误读为m_ClearFlags的值。解决方案是启用AssetStudio的“Strict TypeTree Matching”模式需修改源码在TypeTreeManager.cs中将GetBestMatch方法改为public static TypeTree GetBestMatch(string className, Version unityVersion) { var candidates _typeTrees.Where(t t.m_Type className).ToList(); // 仅返回完全匹配版本的TypeTree不降级 return candidates.FirstOrDefault(t t.m_Version unityVersion) ?? throw new InvalidOperationException($No TypeTree for {className} {unityVersion}); }启用后若无精确匹配AssetStudio会直接报错而非降级逼迫你手动补充TypeTree——这正是专业团队需要的确定性。5.3 内存溢出的隐性杀手AssetStudio的ObjectInfo缓存机制AssetStudio为提升性能会将所有ObjectInfo缓存在内存中。对于含10万个GameObject的大型BundleObjectInfo数组本身占用约120MB内存而AssetStudio的缓存策略是永不释放——即使你关闭Bundle这些内存仍被AssetStudioCore.ObjectReader静态持有。表现症状连续加载5个大型Bundle后AssetStudio进程内存占用达6GBUI严重卡顿。任务管理器中Private Bytes持续增长但Working Set不下降。修复方法是在AssetStudioGUI.MainWindow类中重写OnClosing事件protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); // 清理所有静态缓存 AssetStudioCore.ObjectReader.ClearCache(); AssetStudioCore.TypeTreeManager.ClearCache(); GC.Collect(); GC.WaitForPendingFinalizers(); }更彻底的方案是改用弱引用缓存WeakReference但这需要重构核心模块。我在某开放世界项目中因未清理缓存导致自动化脚本运行到第3轮时崩溃最终采用“每处理1个Bundle就重启AssetStudio进程”的土办法解决。5.4 导出格式的致命误区Prefab vs GameObject的哲学差异AssetStudio提供“Extract as Prefab”和“Extract as GameObject”两个选项多数人直觉选前者。但Prefab是Unity Editor的序列化格式包含m_PrefabInstance、m_PrefabAsset等Editor专用字段在运行时环境中无法直接使用。而GameObject是纯运行时对象导出为.asset文件后可通过Resources.LoadGameObject()直接实例化。真实案例某团队用“Extract as Prefab”导出NPC模型放入Unity工程后发现无法挂载脚本——因为Prefab中m_GameObject字段指向的是PPtrGameObject而该GameObject未被导出。正确做法是选中Prefab → 右键“Extract as GameObject”导出的.asset文件用文本编辑器打开确认其m_Component数组完整将.asset文件放入Resources文件夹代码中调用Instantiate(Resources.LoadGameObject(npc_model))。最后分享个小技巧AssetStudio导出的.asset文件若想在Unity中直接双击预览需在文件头部添加%YAML 1.1标识。用sed命令批量处理sed -i 1s/^/%YAML 1.1\n/ *.asset。这样Unity Editor就能正确识别其为YAML格式资源省去手动拖入的步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2633396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…