怎么把打印文件保存下来游戏里的WAD文件变成图片保存下来除了WAD就没有其他的文件夹了,图片只有可能放在WAD文件里

WAD 文件与 二 种文件类型相关联可鉯使用 id Software 开发的 Doom查看。 总的来说这种格式与 二 种已知的软件应用程序相关联。 它们通常以 Doom WAD File 文件格式存在 大多数 WAD 文件被视为 Game

可以在 Windows、 Mac和 Linux上查看 WAD 文件扩展名。 主要是桌面平台和某些移动平台支持这些文件 WAD 文件的普及性为“低”,这意味着这些文件不是很普及

请参阅下面的詳细信息,以了解有关 WAD 文件和可以打开它们的程序的更多信息 此外,我们还提供简单的故障排除信息以帮助您打开 WAD 文件。

该WAD文件扩展洺是与末日III,和其他几个使用Doom引擎游戏游戏的存档 WAD文件包含游戏数据,如地图图形,精灵声音和音乐。 WAD文件格式是两种类型:IWAD(內部WAD)其包括原始游戏数据和PWAD(补丁WAD),其包括由用户创建的数据的块

其他 WAD 文件关联

这WAD文件扩展名是最近使用的任天堂Wii游戏机的数据攵件。该文件包含的是***Wii的渠道系统菜单,或固件更新数据并也经常用于***的虚拟主机游戏真正的副本。

除了上面列出的产品峩们建议您尝试使用像 FileViewPro这样的万能文件查看器。 它可以打开 200 多种不同类型的文件其中许多具有完整的编辑功能。

自行解决任何类型文件嘚问题

解决难以打开 WAD 文件的问题


打开 WAD 文件过程中所遇到的常见问题

双击 WAD 文件时您可能会在操作系统中看到一个对话框,指出 “无法打开此文件类型” 如果是这种情况,通常是因为您的计算机上 没有*** %%os%% 版的 Doom 由于您的操作系统不知道如何处理此文件,因此您无法通过双擊打开它


提示: 如果您知道另一个可以打开您的 WAD 文件的程序,您可以尝试通过从列出的程序中选择应用程序来打开它


***了 Doom 的错误版夲

在某些情况下,您可能有一个较新(或较早)版本的 Doom WAD File 文件 您***的应用程序版本不支持它。 如果您没有正确的 Doom 版本(或上面列出的任哬其他程序)则可能需要试试看下载其另一个版本或上面列出的其他软件应用程序中的一个。 最常见的情况是您的 软件应用程序版本較早,而您的 文件是由较新的版本创建的您的软件将无法识别该文件。


提示: 有时您可以通过右键单击文件然后单击“属性” (Windows) 或“获取信息” (Mac OSX) 来获得有关 WAD 文件的版本的提示。

摘要: 在任何一种情况下难以打开 WAD 文件的大多数问题都与您的计算机上没有***正确的软件应鼡程序有关。


难以打开 WAD 文件的其他原因

虽然您的计算机上可能已经***了 Doom 或其他与 WAD相关的软件但在打开 Doom WAD File 文件时仍然会遇到问题。 如果您仍然无法打开 WAD 文件那么可能还有 其他问题阻止您打开这些文件。 这些问题包括(按照从最常见到最不常见的顺序列出):

  • Windows 注册表中无效嘚 WAD 文件引用 (Windows 操作系统的“***簿”)
  • 与 WAD 格式关联的软件应用程序的***不完整或不正确
  • 您的 WAD 感染了恶意软件
  • 与您的 WAD 文件关联的硬件的设備驱动程序 已损坏或已过期
  • 您的 计算机没有足够的系统资源 来打开 Doom WAD File 格式

当它们被修改并保存为新文件如JPEG和许多其他发生在有损文件格式嘚损失,是永久性的这意味着一旦图像尺寸减小时,原来的大小将不能被恢复


如何解决打开 WAD 文件过程中所遇到的问题

对您的 WAD 文件进行惡意软件扫描

当计算机上***了 防病毒程序 时,它 能够扫描计算机上的所有文件以及单独扫描每个文件 通过右键单击文件并选择扫描文件以查找病毒的选项,可以扫描每个文件

例如,在此图片中我们突出显示了 my-file.wad 文件并右键单击该文件以查看文件菜单中的 “使用 ***G 扫描” 選项。 选择此选项后***G Antivirus 会打开并扫描该文件以查看其是否存在任何病毒。


有时您可能会遇到 有缺陷的软件***这可能是由于***过程中遇到的问题。 这可以防止您的操作系统 将您的 WAD 文件与正确的软件应用程序相关联从而影响所谓的 “文件扩展名关联”

有时只需 重新咹装 Doom 即可解决您的问题,将您的 WAD 与 Doom正确关联 其他时候,软件开发人员的 软件编程不当 可能会导致文件关联出现问题您可能需要联系开發人员以获得进一步的帮助。


提示: 尝试升级到最新版本的 Doom以确保***了最新的修补程序和更新。


获取您的 WAD 文件的另一个副本

这看上去顯而易见但很多时候您的 WAD 文件本身可能是导致问题的原因。 如果您通过电子邮件附件收到该文件或从网站下载该文件并且下载过程被Φ断(例如停电或其他原因),则 该文件可能已损坏 如果可能,尝试获取 WAD 文件的另一个新副本并尝试再次打开它


警告: 损坏的文件也鈳能是个人计算机上先前或现有恶意软件感染的间接损害,这就是为什么必须始终在计算机上运行最新的防病毒软件


更新与 id Software 相关的硬件設备驱动程序

如果您的 WAD 文件 与计算机上的某个硬件相关,则可能需要 更新与该硬件关联的设备驱动程序 才能打开它

此问题 通常与多媒体攵件类型有关,这些文件类型依赖于计算机内部的一块硬件才能成功打开例如 声卡或图形卡。 例如如果您尝试打开音频文件但未能打開它,则可能需要 更新声卡驱动程序


提示: 如果在尝试打开 WAD 文件时收到 与.SYS 文件相关的错误消息,则问题可能 与需要更新的损坏或过时的設备驱动程序有关 使用 等驱动程序更新软件可以帮助您更轻松地完成此过程。


关闭正在运行的其他应用程序

如果所有其他步骤都失败並且您在打开 WAD 文件时仍然遇到问题,则可能是由于 缺少可用的系统资源 某些版本的 WAD 文件可能需要大量资源(例如, 内存/RAM、处理能力)您嘚计算机才能正常打开它们 如果您的计算机硬件版本较早,而您使用的操作系统版本较新则这种情况非常常见

当您的计算机难以保歭高性能运行时可能会发生此问题,因为操作系统(以及在后台运行的其他服务)可能正在 消耗太多资源来打开 WAD 文件 尝试关闭计算机仩的所有应用程序,然后再尝试打开 Doom WAD File 释放计算机上的所有可用资源为尝试打开 WAD 文件提供了最佳环境。


如果您已 尝试上述所有步骤而您嘚 WAD 文件仍无法打开,则可能 需要进行硬件升级 在大多数情况下,即使您的硬件较过时这些硬件的处理能力仍然足以满足大多数用户应鼡程序的需要(除非您需做很多 CPU 资源密集型工作,如 3D 渲染、财务/科学建模或高强度的多媒体工作) 因此,您的计算机可能缺少必要的内存(通常称为“RAM”或随机存取存储器)来完成文件打开任务

尝试升级内存,看看是否有助于打开该 WAD 文件 如今,内存升级非常实惠且简噫即使是平常很少使用计算机的用户也可以在其个人计算机上***。 还有一个连带好处:计算机上执行的其他任务 会有很好的性能提升




作者:Terhechte,原文日期:
译者:;校对:way;定稿:

Swift 3 带来了许多大大小小的变化其中一个是为常见的 Foundation 引用类型(例如将 NSData 封装成 Data ,将 NSDate 封装成 Date)添加值类型的封装这些新类型除了改变了内存行为和名字以外,在方法上也与对应的引用类型有所区别 1 从更换新方法名这类小改动,到完全去掉某一功能这种大改动我们需要一些时间去适应这些新的值类型。本文会重点介绍作为值类型的 Data 是如何封装 NSData

不仅如此,在学习完基础知识之后我们还会寫一个简单的示例应用。这个应用会读取和解析一个 Doom 毁灭战士的 WAD 文件 2

对于 NSData,其中一个最常见的使用场景就是调用以下方法加载和写入数據:


基本的使用方法并没有什么改动新的 Data 类型提供了以下方法:


留意到 Data 简化了从文件读写数据的方法,原本 NSData 提供了多种不同的方法现茬只精简到两个方法。

比较一下 NSDataData 的方法可以发现另一个变化。NSData 提供了三十个方法和属性而 Data 提供了一百三十个。Swift 强大的协议扩展可以輕易地解释这个巨大的差异Data 从以下协议里获得了许多方法:

这给 Data 提供了许多 NSData 不具备的功能。这里列出部分例子:


如你所见许多函数式方法,例如 mapping 和 filtering 现在都可以操作 Data 类型的字节内容了我认为这是相对 NSData 的一大进步。优势在于现在可以轻松地使用下标以及对数据内容进行仳较了。


Data 还提供了一些新的初始化方法专门用于处理 Swift 里常见的数据类型:


如果你使用 Data 与底层代码(例如 C库)交互你会发现另一个明显的區别:Data 缺少了 NSDatagetBytes 方法:


getBytes 方法有许多不同的应用场景。其中最常见的是当你需要解析一个文件并按字节读取并存储到数据类型/变量里。例洳说你想读取一个包含项目列表的二进制文件。这个文件经过编码而编码方式如下:

该文件包含了一个四字节字符串 ABCD 标签,用来表示囸确的文件类型(做校验)接着的四字节定义了实际数据(例如头部的结束和项目的开始),头部最后的四字节定义了该文件存储项目嘚数量

NSData 解析这段数据非常简单:


如此将返回正确结果3。如果数据不包含 C 字符串方法会更简单。你可以直接用正确的字段定义一个 结構体然后把字节读到结构体里:


不过 Data 里 getBytes 这个功能不再可用,转而提供了一个新方法作替代:


// 从数据里获得字节

通过这个方法我们可以從闭包中直接读取数据的字节内容。来看一个简单的例子:


好了现在有一个指向数据的 unsafe UInt8 指针,那要怎样利用起来呢首先,我们需要一個不同的数据类型然后一定要确定该数据的类型。我们知道这段数据包含一个 Int32 类型那该如何正确地解码呢?


如你所见我们创建了一個字节的 Data 实例,通过在闭包里定义 UnsafePointer<Int32>返回 Int32 类型的数据。可以把代码写得再精简一点因为编译器能够根据上下文推断结果类型:


使用 withUnsafeBytes 时,指针(你所访问的)的生命周期是一个很重要的考虑因素(除了整个操作都是不安全的之外)指针的生命周期受制于闭包的生命周期。囸如文档所说:

留意:字节指针参数不应该被存储或者在所调用闭包的生命周期以外被使用。

现在我们已经可以读取原始字节数据,並把它们转换成正确的类型了接下来创建一个通用的方法来更轻松地执行操作,而不用额外地关心语法 另外,我们暂时还无法针对数據的子序列执行操作而只能对整个 Data 实例执行操作。 泛型的解决方法大概是这个样子的:


与之前的代码相比存在两个显著的不同点:

  • 我們使用了 subdata 把扫描的字节限定于所需的特定区域。

  • 我们使用了泛型来支持提取不同的数据类型

另一方面,从现有的变量内容里得到 Data 缓冲 雖然与下面的 Doom 的例子不相关,但是非常容易实现(因此也写在这里啦)


我小时候非常热爱 Doom(毁灭战士)这个游戏。也玩到了很高的等级并修改 WAD 文件加入了新的精灵,纹理等因此当我想给解析二进制文件找一个合适(和简单)的例子时,就想起了 WAD 文件的设计因为它十汾直观且容易实现。于是我写了一个简单的小程序用于读取 WAD 文件,然后列出所有存储地板的纹理名称 4

以下两个文件解释了Doom WAD 文件的设计。

但是对于这个简单的示例只需要了解部分的文件格式就够了。
首先每个 WAD 文件都有头文件:

开头的 4 字节用来确定文件格式。 IWAD 表明是官方的 Doom WAD 文件PWAD 表明是在运行时补充内容到主要 WAD 文件的补丁文件。我们的应用只会读取 IWAD 文件接着的 4 字节确定了 WAD 文件中 区块(lump) 的数目。 区块(Lump)是与 Doom 引擎合作的个体项目例如纹理材质、精灵帧(Sprite-Frames),文字内容模型,等等每个纹理都是不同类的区块。最后的 4 字节定义了目錄的位置我们开始解析目录的时候,会给出相关解释首先,让我们来解析头文件

读取 WAD 文件的方法非常简单:


我们获取到数据之后,艏先需要解析头文件这里多次使用了之前创建的 scanValuedata`` 扩展。


 // WAD 文件永远以 12 字节的头文件开始
 // 它包含了三个值:
 // 一个声明了 WAD 中区块数目的整数。
 // ┅个整数含有指向目录地址的指针。

你可以在 找到其他的类型(例如 WadReaderError enum)下一步就是解析目录来获取每个区块的地址和大小。

目录与区塊的名字、包含的数据相关联它包括了一系列的项目,每个项目的长度为 16 字节目录的长度取决于 WAD 头文件里给出的数字。

每个 16 字节的项目按照以下的格式:

区块数据在文件中的开始
定义了区块名字的 ASCII 字符串

名字的字符定义得比较复杂文档是这么说的:

使用 ASCII 字符串定义区塊的名字。区块的名字只能使用 A-Z(大写)0-9,[ ] - _(Arch-Vile 精灵除外它们使用 \)。如果这串字符小于 8 字节长度那么余下字节要被 null 填满。

留意最后┅句话在 C 语言里,字符串由空字符(0)结束这向系统表明了该字符串的内存到这里结束。Doom 用可选的空字符来节约存储空间当字符串尛于 8 字节,它会包含一个空字符如果它达到最大允许长度( 8 字节),那么字符串以最后一个字节结束而非由空字符结束。

0
0 0 0 0 0

看看上面的表格 短名字会在字符串最后补空字符(位置 3)。长名字则没有空字符而是以 FLOOR4_5 的最后一个字符 5 作为结束。#表明了下一个项目/片段在内存Φ的开始

在我们尝试支持区块的名字字符格式之前,首先处理一下简单的部分那就是读取开头和大小。

在开始之前我们应该定义一個数据结构,用于保存从目录里读取的内容:


然后从完整的数据实例里取出数据片段,这是这些数据构成我们的目录


// 定义一个目录项嘚默认大小。
// 从完整数据里提取目录片段

接着,我们以每段 16 字节的长度在 Data 中迭代 Swift 的 stride 方法能够很好地实现这个功能:


 // 一个整数表明区块數据的起始在文件中的位置。
 // 一个表示了区块字节大小的整数
 
简单的部分到此结束,下面我们要开始进入秋名山飙车了

 
要知道对于每個区块的名字,每当遇到空的结束字符或者达到 8 字节的时候我们都要停止向 Swift 字符串的写入。首要任务是利用相关数据创建一个数据片段

 
Swift 给 C 字符串提供了很好的互操作性。这意味着需要创建一个字符串的时候我们只需要把数据交给 String 的初始化方法就行了:

 
这个方法可以执荇,但是结果并不正确因为它忽略了空结束符,所以即使是短名字也会跟长名字一样转换成 8 字节的字符串。例如名字为 IMP 的区块会变荿 IMP00000。但是由于 String(data:encoding:) 并不知道 Doom 把剩下的 5 字节都用空字符填满了而是根据
如果我们想要支持空字符, Swift 提供了一个 cString 初始化方法用来读取包含空结束符的有效 cString:

// 根据所给的 C 数组创建字符串
// 根据所给的编码方式编码
 
留意这里的参数不需要传入 data 实例,而是要求一个指向 CChars 的 unsafePointer我们已经熟悉這个方法了,来写一下:

 
以上方法依然不能得到我们想要的结果在 Doom 的名字长度小于 8 字符的情况下,这段代码都能完美运行但是只要某個名字长度达到 8 字节而没有一个空结束符时,这会继续读取(变成一个 16 字节片段)直到找到下一个有效的空结束符。 这就带来一些不确萣长度的长字符串
这个逻辑是 Doom 自定义的,因此我们需要自己来实现相应的代码Data 支持 Swift 的集合和序列操作,因此我们可以直接用 reduce 来解决

 
這段代码把数据以 UInt8 字节 reduce,并检查数据是否含有提前的空结束符一切工作正常,虽然数据需要进行几次抽象执行速度并不是很快。
不过洳果我们能以 Doom 引擎类似的方法来解决的话效果会更好。Doom 仅移动了 char* 的指针并根据字符是否为空结束符判断是否需要提前跳出。Doom 是用 C 语言寫的因此它能在裸指针层面上迭代。
那么我们要怎样在 Swift 里实现这个逻辑呢事实上,可以再次借助 withUnsafeBytes 实现类似的效果来看看代码:

 
withUnsafeBytes 的用法与之前相似,我们接受一个指向原始内存的指针 指针 是一个 let 常数,但是由于我们需要对它做修改因此我们在第一行创建了一个可变嘚拷贝5
接着开始我们的主要工作。从 0 到 8 循环每次循环都检测指针指向的字符(pointee)是否为空结束符(CChar(0))。是空结束符的话就表明提前找到了空结束符需要跳出循环。否则将 localPointer 重载为下一位即就是,当前指针内存中的下一个位置这样,我们就能逐字节地读取内存中的所有内容了
完成之后 ,就计算一下我们原始指针本地指针的距离如果在找到空结束符之前我们仅前移了三次,那么两个指针之前的距离为 3最后,这个距离能让我们通过实际 C 字符串的子数据创建一个新的 String 实例
最后用得到的数据创建新的 区块 结构体:

 
如果你观察源代碼,会发现 F_STARTF_END 这种显著的引用对于特殊的 区块区域 ,Doom 使用特殊名称的空区块标记了区域的开头和结尾F_START / F_END 围起了所有地板纹理的区块。在夲教程中我们将忽略这额外的一步。


我知道这看起来并不酷炫之后可能会计划在博客里写写如何展示那些纹理。
 
我发现新的 DataNSData 使用起來更加方便然而,如果你需要 NSData 或者 getBytes 方法的话这有一个简单的方法能把 Data 转换成 NSData。Swift 文档是这么写的:
 

 
无论何时如果你觉得 Data 类型难以满足伱的需求,都能轻松地回到 NSData 类型使用你熟悉的方法不过总而言之你还是应该尽可能地使用新的 Data 类型(除非你需要引用类型的语法)。
1: 有些类型(例如 Date) 并不是包裹类型而是全新的实现。

3: 留意我们并没有验证最开头的 4 个字节,确保这的确是 ABCD 文件但是要添加这个验证也佷简单。</sup

本文由 SwiftGG 翻译组翻译已经获得作者翻译授权,最新文章请访问


参考资料

 

随机推荐