如何将void *数据保存到头文件中?

时间:2013-05-21 09:15:35

标签: c image export header-files

我目前正在处理图像并在程序上生成图像,然后将它们转换为dds或rtc1。由于我的程序的约束,我无法打开外部文件,所以我希望它们嵌入代码。

我发现GIMP有一个“c header”导出器,但我想自己为我生成的那样做 纹理。

使用void *可以将其用于任何类型的数据。

更新:为了澄清事情,我正在考虑像这样输出unsigned int:

void exportToHeader(const void* data, const uin32_t size, const char* name)
{
    uint32_t* pData = (uint32_t*)data;

    printf("void* %s = {\n");

    // TODO: handle last case
    for (int i = 0; i < size; ++i) {
        printf("%s, ", pData[i]);
    }

    printf("};\n");            
}

编译器是否能够理解这一点?

2 个答案:

答案 0 :(得分:1)

如果我理解你的意思,你想要做的就是将二进制图像导入你的C代码。

那么在这种情况下我要做的是,编写一个简单的程序,将文件转储为字节列表并写出这样的输出:

char mydata[] = { 122, 334, 45, ... };

然后你可以简单地包含这个文件并引用你的纹理,就像任何其他C数组一样。

转储文件相当简单(伪代码)。

file = open(file);
printf("char mydata[] = {\n");
while(file != eof)
{
    c = getc(file);
    printf("%d, ", c);
}
close(file);
printf("\n\;\n");

您可以在C代码中包含任何二进制文件。

答案 1 :(得分:1)

我最终这样做了:

        uint32_t* intData = (uint32_t*)data; 
        for (int i = 0; i < size; ++i) {
            if (i == size -1) {
                fprintf(fp, "%uu };", intData[i]);
            } else {
                fprintf(fp, "%uu, ", intData[i]);
            }
        }

当然,您必须确保在4个字节上对齐才能转换为uint32_t *