嘿,我现在正在试着模仿一个旧的游戏机。我遇到了一个小问题,我不知道该怎么解决。
更具体地说,我正在为GBA做一个模拟器。但为了让它更具挑战性,我决定将游戏模拟为具有内存的外部设备,可能还有额外的CPU等等。就像他们在现实世界中一样。要做到这一点,我需要创建一个自包含的可执行文件,其中分配了一些固定大小的备用内存来保存数据,如保存的游戏。
这个是可能的吗?我知道这是不常见的坏习惯。我不关心,就像人们说不要在C中使用GOTO一样,指令是要用的,我用它的效果很好,没有头疼,也没有奇怪的行为,它只需要片刻的计划,也许还需要一门编译器实现的课程来了解如何使用它。
语言并不重要,C语言也可以,但如果.net支持它,我会更喜欢它。
发布于 2020-05-19 03:03:01
您可以采用一些自解压归档所使用的方法。在编译的可执行文件后追加标记GUID和数据块
(可执行文件)+(标记GUID) +(数据区)
例如,在Windows中,使用命令框:
type "c:\vsprojects\my-gba\release\my-gba.exe" "c:\data-files\guid.txt" "c:\data-files\save-data-area.txt" > "c:\data-files\gba-combo.exe"在Linux中,您需要将这3个部分合并到一个新文件中,以形成包含数据的可执行文件。
要查找数据区的起始位置,请在EXE中搜索GUID,然后查找它。
GUID在您的代码中自然出现的可能性非常小,但GUID越长,这种可能性就越低。例如,您可以使用联机GUID生成器并在GUID文本文件中组合多个字符串
731056dd-1dd7-4f46-b90b-2ad623198404 a2d0cd76-f8fc-4bcf-8a15-80ca4d9b205f您确实需要确保您的代码编写方式不会将GUID作为字符串常量嵌入到代码前面的附加标记之前。
不好:
const char* foo = "731056dd-1dd7-4f46-b90b-2ad623198404 a2d0cd76-f8fc-4bcf-8a15-80ca4d9b205f"
-- code that seeks for foo ---好的:
const char* arr[] = { "731056dd-1dd7-4f46-b90b-2ad623198404", "BREAK-MATCH", "a2d0cd76-f8fc-4bcf-8a15-80ca4d9b205f" };
-- code sets foo from arr [0], " ", [2] then seeks for foo ---https://stackoverflow.com/questions/61876770
复制相似问题