SAFE []在这里意味着什么?

时间:2011-07-26 15:54:54

标签: c++ visual-studio char

所以我从here看看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下编译。如何使其工作(不使用任何特殊的Windows函数),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 ++类中可用?

3 个答案:

答案 0 :(得分:3)

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

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

这样,当一个字符在URI中有效时,SAFE[*pSrc]只是非零(“真”),而在非URI时则为零(“假”)。

答案 1 :(得分:3)

含义

我会说SAFE包含安全和不安全字符的标记。

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

“如何使其在C ++中可用”

将数组与the character handling functions in cctype.h进行比较我认为您可以通过调用isalnum()来简单地替换数组。

答案 2 :(得分:2)

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

因此,for循环正在字符串中运行,如果当前字符不在范围列表中,那么它将被转换为十六进制值。