我正在捕获网络数据包的有效负载。有效负载为string
形式。然后我将string
转换为char array
。现在,我想计算每个数据包有效负载的大小
string payload;
payload = raw_payload->GetStringPayload();
char input[payload.length()];
strcpy(input,payload.c_str());
int size;
size=strlen(input);
LOGfile_length << size << " " << payload.length() << endl;
当我打印数据包有效负载的大小时,string
有效负载和char array
有效负载会有所不同。为什么会这样?
140 1448
71 1448
67 1448
0 6
0 6
0 6
0 63
现在,我正在做这个
memcpy ( input, payload.c_str(), strlen(payload.c_str())+1 );
但数据包的大小仍然不同
答案 0 :(得分:4)
将代码更改为
char input[payload.length()+1];
这是因为payload.length将返回字符串中的字符数。我们还需要一个字节来存储'\ 0'字符。
希望这会有所帮助。
答案 1 :(得分:3)
我怀疑这是因为您的有效负载包含\0
个字符。
您可以使用以下代码轻松检查:
for(int i=0; i<payload.length(); i++) printf("%d\n", payload.c_str()[i]);
或者,为了缩短输出(感谢Agent_L),
for(int i=0; i<payload.length(); i++)
if(payload.c_str()[i]==0)
printf("Found \\0 at %d\n", i);
如果你在那里看到0个符号 - 你有字节数组,它们不适合普通的C字符串。
P.S。和shintoZ也是对的。
答案 2 :(得分:2)
strcpy
和strlen
会在输入中遇到NUL(零字节)后立即停止。 NUL很可能出现在网络数据包数据的中间,这意味着在第一个NUL之后你不会看到任何数据包数据。
一种工作方法是使用string::length()
和memcpy
:
string payload = raw_payload->GetStringPayload();
char input[payload.length()];
size_t size = payload.length();
memcpy(input, payload.c_str(), size);
LOGfile_length << size << " " << payload.length() << endl;