一个非常简单和新手问题的长问题,但我需要一些建议。
背景
所以我有一个需要解析的二进制文件。该文件以一些包含空字符 ( \0
) 的魔术字符串开头。让我们定义为ab\0cd
。
如果某个文件以魔术字符串开头,我正在编写一个返回 true 的方法。
尝试 1
#define MAGIC_STRING "ab\0cd"
bool IsMagicFile(const wpath& pathFile)
{
string strData;
if (!ReadFile(pathFile, strData))
return false;
if (strData.size() < 5)
return false;
string strPrefix = strData.substr(0, 5);
if (strcmp(strPrefix.c_str(), MAGIC_STRING) != 0)
return false;
return true;
}
问题 1
上面的代码困扰我的是我“硬编码”假设魔术字符串的大小是5
.
如果明天魔术字符串发生变化怎么办?说:
#define MAGIC_STRING "abe\0fcd"
字符串宏已更改,代码不再正常工作。
尝试 2
#define MAGIC_STRING "ab\0cd"
bool IsMagicFile(const wpath& pathFile)
{
string strMagic = MAGIC_STRING;
string strData;
if (!ReadFile(pathFile, strData))
return false;
if (strData.size() < strMagic.size())
return false;
string strPrefix = strData.substr(0, strMagic.size());
if (strcmp(strPrefix.c_str(), MAGIC_STRING) != 0)
return false;
return true;
}
问题 2
据说我摆脱了硬编码的大小问题,但大小strMagic
不是真正的 5,而是 2。字符串以\0
尝试 3
#define MAGIC_STRING "ab\0cd" // CAUTION - MAGIC_STRING & MAGIC_STRING_SIZE must be changes together
#define MAGIC_STRING_SIZE 5 // CAUTION - MAGIC_STRING & MAGIC_STRING_SIZE must be changes together
bool IsMagicFile(const wpath& pathFile)
{
string strData;
if (!ReadFile(pathFile, strData))
return false;
if (strData.size() < MAGIC_STRING_SIZE)
return false;
string strPrefix = strData.substr(0, MAGIC_STRING_SIZE);
if (strcmp(strPrefix.c_str(), MAGIC_STRING) != 0)
return false;
return true;
}
问题 3
这解决了第一个问题,但我仍然没有得到我想要的无缝魔术字符串更改。
问题
尝试 3 是否足够好?你有更好的方法吗?