SAFE[]在这里是什么意思

What does SAFE[] means here?

本文关键字:是什么 意思 在这里 SAFE      更新时间:2023-10-16

所以我从这里来看UrlEncode函数:

std::string UriEncode(const std::string & sSrc)
{
   const char DEC2HEX[16 + 1] = "0123456789ABCDEF";
   const unsigned char * pSrc = (const unsigned char *)sSrc.c_str();
   const int SRC_LEN = sSrc.length();
   unsigned char * const pStart = new unsigned char[SRC_LEN * 3];
   unsigned char * pEnd = pStart;
   const unsigned char * const SRC_END = pSrc + SRC_LEN;
   for (; pSrc < SRC_END; ++pSrc)
   {
      if (SAFE[*pSrc]) 
         *pEnd++ = *pSrc;
      else
      {
         // escape this char
         *pEnd++ = '%';
         *pEnd++ = DEC2HEX[*pSrc >> 4];
         *pEnd++ = DEC2HEX[*pSrc & 0x0F];
      }
   }
   std::string sResult((char *)pStart, (char *)pEnd);
   delete [] pStart;
   return sResult;
}

它不是在我的Visual Studio 2008下编译的。如何使其工作(最好不要使用任何特殊的窗口函数(,SAFE[ const unsigned char ]到底意味着什么?

更新:查看源代码下的zip文件,我发现

const char SAFE[256] =
{
    /*      0 1 2 3  4 5 6 7  8 9 A B  C D E F */
    /* 0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* 1 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* 2 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* 3 */ 1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0,
    /* 4 */ 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
    /* 5 */ 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
    /* 6 */ 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
    /* 7 */ 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
    /* 8 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* 9 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* A */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* B */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* C */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* D */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* E */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
    /* F */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
};

它让我害怕…如何使它在C++类中可用?

SAFE只是一个数组,用于标记URI中哪些字符是有效的。它甚至有行和列注释,以便更容易地查看哪个条目是哪个条目。

您将看到第一个有效字符是0x30或0。0x41-0x5A是大写字母等

这样,当字符在URI中有效时,SAFE[*pSrc]就是非零("true"(,而当字符不有效时,它就是零("false"(。

含义

我认为SAFE包含安全和不安全字符的标志。

因此,如果SAFE[c]计算为true(即数组值不是0(,则字符是安全的,不需要编码。

"如何使它在C++中可用

将数组与cctype.h中的字符处理函数进行比较,我认为您可以简单地将数组替换为对isalnum()的调用。

您是否尝试在源代码中搜索SAFE?这是一个256宽的数组,定义在第72行。基本上,0-9、a-z和a-z范围内的所有ASCII字符都标记为安全,而其他字符则不安全。

因此,for循环在字符串中运行,如果当前字符不在安全的范围列表中,则会将其转换为十六进制值。