String length()与char数组strlen

时间:2014-04-07 13:03:43

标签: c++

我正在捕获网络数据包的有效负载。有效负载为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 );

但数据包的大小仍然不同

3 个答案:

答案 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)

strcpystrlen会在输入中遇到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;