gpt4 book ai didi

c - 是否可以将二进制数据嵌入到 Turbo C 生成的 DOS EXE 中?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:19 29 4
gpt4 key购买 nike

我用Turbo C++搭建了一个DOSBox开发环境,打算和 friend 一起做个游戏。

我正在使用 C 代码,想知道如何将二进制数据链接到 EXE 中。 (我以前使用 C 的所有经验都是 libGBA,如果这实际上不是我认为的可能,我很抱歉。)

如果不可能,那么嵌入二进制数据的替代方案是什么? (我真的不想在游戏目录中需要一堆二进制文件...)

找不到太多关于 Turbo C 的第三方文档,特别是考虑到我使用的是另一种受支持但不是我的 IDE 的主要语言,它在完全迁移到另一个操作系统后于 2000 年代初进行了最后一次更新。

最佳答案

自解压 .zip 文件等程序使用的一种简单解决方案是将数据简单地附加到 .exe 文件的末尾。 .exe 的大小可以根据 header 中的值计算得出,这将为您提供附加数据开始处的偏移量。下面是一个用 Borland Turbo C v2.01(作为免费软件提供)编译的示例 C 程序 - 请注意,为清楚起见,我省略了错误检查:

#include <stdio.h>

int main(int argc, const char *argv[])
{
FILE *fSelf;
unsigned short lenFinalBlock, numBlocks;
unsigned long offEnd;
char trailing[256];
int len;

/* Open our own .exe file */
fSelf = fopen(argv[0], "rb");

/* Read part of the .exe header */
fseek(fSelf, 2, SEEK_SET);
fread(&lenFinalBlock, 2, 1, fSelf);
fread(&numBlocks, 2, 1, fSelf);

/* Calculate the size of the .exe from the header values */
offEnd = numBlocks * 512;
if (lenFinalBlock) offEnd -= 512 - lenFinalBlock;

/* Jump to the end of the .exe and read what's there */
fseek(fSelf, offEnd, SEEK_SET);

/* Just read it as a string - you'd presumably be using
some custom data format here instead */
len = fread(trailing, 1, 256, fSelf);
trailing[len] = 0;

printf("Trailing data (%d bytes @ 0x%lX):\n%s", len, offEnd, trailing);

fclose(fSelf);

return 0;
}

编译为 trailing.exe 后,您可以像这样使用它:

C:\>trailing
Trailing data (0 bytes @ 0x2528):

我在 Linux 上,所以我将使用 shell 附加一些示例数据:

$ echo Hello >> trailing.exe

再次运行它显示它拾取了尾随数据:

C:\>trailing
Trailing data (6 bytes @ 0x2528):
Hello

关于c - 是否可以将二进制数据嵌入到 Turbo C 生成的 DOS EXE 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55703078/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com