我正在尝试为SCGI请求编写解析器。我试图解析示例中描述的字符串,但由于某种原因,我找不到第二个空字符的位置,即分隔内容长度值和下一个属性名称的位置。
这是我的测试字符串:
string scgi_request(
"70:CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0" \
"/deepthought\0,What is the answer to life?"
, 91);
我可以找到第一个空字符的位置,位置18.但是一旦我试图在那之后找到一个,返回的位置无效,由几个字符关闭,一直到位置24。
这是我的算法:
size_t contentLengthEnd = scgi_request.find('\0');
size_t contentLengthValueEnd = scgi_request.find('\0', ++contentLengthEnd);
std::cerr << contentLengthEnd << std::endl; // 19, because I shifted this one forward
// otherwise I'd always get the same
// character
std::cerr << contentLengthValueEnd << std::endl; // 24, no clu why.
答案 0 :(得分:8)
你的字符串开始了:
"70:CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0"
这些输出对于您提供的字符串实际上是正确的。我猜你可能会忽略\027
是一个八进制字符常量,依此类推。字符及其索引是:
16: 'H'
17: '\027'
18: '\0'
19: 'S'
20: 'C'
21: 'G'
22: 'I'
23: '\01'
24: '\0'
25: 'R'
您的程序会找到'\0'
和18
的前两个24
,但在输出之前您会在第一个++
上找到19
,因此输出{{} 1}}和24
。
如果您的意思是'\0'
,那么'2'
然后是'7'
,那么您就不需要将这些内容并置,例如利用字符串文字串联:
"70:CONTENT_LENGTH\0"
"27\0"
"SCGI\0"
"1\0"