如何让fread()从内存中读取数据?

问题描述 投票:0回答:1

Amxmodx使用这样的宏读取数据:

#define DATAREAD(addr, itemsize, itemcount) \
    if (fread((addr), (itemsize), (itemcount), (m_pFile)) != (itemcount)) \
    { \
        if (feof(m_pFile)) \
            m_Status = Err_FileInvalid; \
        else \
            m_Status = Err_FileRead; \
        fclose(m_pFile); \
        m_pFile = NULL; \
        return; \
    }

读取这样的数据:

mint32_t magic;
    DATAREAD(&magic, sizeof(magic), 1);

    m_OldFile = false;

    if (magic == 0x524C4542)
    {
        //we have an invalid, old, RLEB file
        m_Status = Err_OldFile;
        fclose(m_pFile);
        m_pFile = NULL;

        return;
    }
    else if (magic == MAGIC_HEADER2)
    {
        DATAREAD(&m_Bh.version, sizeof(int16_t), 1);

        if (m_Bh.version > MAGIC_VERSION)
        {
            m_Status = Err_OldFile;
            fclose(m_pFile);
            m_pFile = NULL;

            return;
        }

        m_AmxxFile = true;
        DATAREAD(&m_Bh.numPlugins, sizeof(mint8_t), 1);
        m_Bh.plugins = new PluginEntry[m_Bh.numPlugins];
        PluginEntry *pe;
        m_SectionHdrOffset = 0;
        m_Entry = -1;

        for (mint8_t i = 0; i < m_Bh.numPlugins; i++)
        {
            pe = &(m_Bh.plugins[i]);
            DATAREAD(&pe->cellsize, sizeof(mint8_t), 1);
            DATAREAD(&pe->disksize, sizeof(int32_t), 1);
            DATAREAD(&pe->imagesize, sizeof(int32_t), 1);
            DATAREAD(&pe->memsize, sizeof(int32_t), 1);
            DATAREAD(&pe->offs, sizeof(int32_t), 1);
        }

有关完整的代码,您可以从此链接https://github.com/alliedmodders/amxmodx/blob/master/amxmodx/amxxfile.cpp中获取参考

我想加密amxx文件。我使用自己的算法解密文件,但我不知道如何使amxmodx正确读取加密的文件。

我的解密器使用DecryptData(bufferin, bufferout, key)之类的功能将该文件完全解密为bufferout。如何使用fread()从bufferout读取数据而不输出解密的文件?

c io fread stdio
1个回答
0
投票

我的解密器使用DecryptData(bufferin, bufferout, key)之类的功能将该文件完全解密为bufferout。我怎么用fread()从bufferout读取数据,而不输出解密的文件?

C标准库的ISO规范不包含任何作为在文件上执行I / O的规定。因此,严格符合 C程序无法执行您描述的操作。

但是,各种C实现确实提供了可以达到目的的扩展。尤其是,如果您使用的是基于GLIBC的系统,或者是符合POSIX 1003.1最新版本的系统,那么会显示fmemopen(),它提供了一种打开fmemopen()的方式,其内容由内存区域定义,而不是而不是外部设备的内容。如果FILE本身在您的环境中不可用,那么您正在寻找这种东西。可能有或没有这种扩展名可用。

© www.soinside.com 2019 - 2024. All rights reserved.