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
读取数据而不输出解密的文件?
我的解密器使用
DecryptData(bufferin, bufferout, key)
之类的功能将该文件完全解密为bufferout
。我怎么用fread()从bufferout
读取数据,而不输出解密的文件?
C标准库的ISO规范不包含任何作为在文件上执行I / O的规定。因此,严格符合 C程序无法执行您描述的操作。
但是,各种C实现确实提供了可以达到目的的扩展。尤其是,如果您使用的是基于GLIBC的系统,或者是符合POSIX 1003.1最新版本的系统,那么会显示fmemopen()
,它提供了一种打开fmemopen()
的方式,其内容由内存区域定义,而不是而不是外部设备的内容。如果FILE
本身在您的环境中不可用,那么您正在寻找这种东西。可能有或没有这种扩展名可用。