【发布时间】:2016-07-03 12:07:12
【问题描述】:
一个非常简单和新手问题的长问题,但我需要一些建议。
背景
所以我有一个需要解析的二进制文件。该文件以一些包含空字符 (\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 是否足够好?你有更好的方法吗?
【问题讨论】:
-
您的问题中有一个标签
C++=> 仅限 std::string,而不是 strcmp => 已解决。 (和const string而不是#define)
标签: c++ string macros null-character