2014-09-11 63 views
0

我有这个peice代码(函数),我接收输入缓冲区数据包作为第一个参数,其长度作为第二个参数。我接收的缓冲区包含一些需要的数据,但还有一些垃圾值。我只需要打印实际的数据(忽略垃圾值)。我怎么做?包含实际数据和一些垃圾值的接收缓冲区

这里去(简化版本)代码:

void decodeResp(char* in_buf, int *Len) 
{ 
    char msg_buffer[100] = {0}; 

    memcpy(msg_buffer,(in_buf),*Len); 

    printf("\n********** Response Recieved: [%s] **********\n",msg_buffer); 
} 

假设如果in_buf包含ACTUAL_DATA+(some garbage),我需要打印只是 “ACTUAL_DATA” 忽略无用值。我该如何检查?上面的代码将打印一切。

在此先感谢。

+0

将'\ 0'置于msg_buffer [Len]位置。或者,如果不是指针,可以使用Len而不是* Len。确保你拷贝了正确的字节数,因为在你的代码中,开始处的缓冲区中有零,%s应该可以正常工作。 – 2014-09-11 10:32:25

+0

什么是垃圾数据?如果你知道期望什么,你可以为它做一个过滤器。此外,垃圾数据是否总是附加到实际数据中,还是在数据之间?如果附加,@ IvanIvanov的解决方案将正常工作。 – mechalynx 2014-09-11 10:41:38

+0

并确保所有符号都是1个字节或使用其他数据类型(非char)。用strcpy复制字符串。 – 2014-09-11 10:42:03

回答

1

首先,您打算如何区分实际数据垃圾

如果实际数据大小之前调用该函数已知,发送该值在*len,该特定大小执行memcpy() [不要忘记添加尾随\0作为串使用。

如果您需要执行内部decodeResp()检查,过滤in_buf,计算实际数据的长度,做memcpy()对于尺寸和打印。


编辑

看来你是通过一些socket接收该数据包。您可以使用recv()调用的返回值来提供*lendecodeResp(),以防万一您使用某个未初始化的缓冲区来接收传入的数据包。

0

当心:

char msg_buffer[100] = {0}; 

只设置msg_buffer的第1个要素为0

你的功能应该是这样的:

void decodeResp(char* in_buf, int *Len) 
{ 
    char msg_buffer[100] ; 
    memcpy(msg_buffer, in_buf, *Len); 

    in_buf[*len] = 0 ; 

    printf("\n********** Response Recieved: [%s] **********\n",msg_buffer); 
} 

假设*Len包含4个in_buf点到“ABCDXXX”,“XXX”是垃圾,“ABCD”是实际数据。

decodeResp在输入时,msg_buffer包含随机剩余值,例如“ghijklmnop”。

调用memcpy后,msg_buffer包含“ABCDklmnop”。

如果您现在打印msg_buffer没有in_buf[*len]=0,您将得到“ABCDklmnop”作为输出。用in_buf[*len]=0 ;你会得到“ABCD”作为输出。

+0

谢谢迈克尔。就一件事。你有点误解了这个问题。如果'in_buf'指向“ABCDXXX”,那么我收到的* Len是7而不是4(* Len包含了包括垃圾长度的总长度)。这里的问题是,每次调用函数decodeResp()时,实际的数据长度都会有所不同。实际的数据总是字母数字,垃圾是从内存中获取的一些垃圾。 因为memcpy(msg_buffer,in_buf,* Len)msg_buffer将包含“ABCDXXX”并且执行in_buf [* Len] = 0将会in_buf [7] = 0。这并不会帮助我解决我的问题:) – 2014-09-11 13:02:19

+0

那么如果长度是错误的,那么无法判断缓冲区的末尾是否是垃圾。例如:长度= 7,缓冲区内容=“ABCD&%ç”。在这种情况下,“&%ç”肯定是垃圾(不是字母数字),实际数据是“ABCD”。但是如果长度为7并且缓冲区包含“ABCDKLM”,会发生什么情况,因此绝对没有办法确定“KLM”是垃圾还是实际数据。 – 2014-09-11 13:08:21

+0

Ohkay !.谢谢你的时间迈克尔。真的很感激它。 – 2014-09-11 13:13:03