C 接收到的缓冲区包含带有一些垃圾值的实际数据

C 接收到的缓冲区包含带有一些垃圾值的实际数据,c,buffer,C,Buffer,我有一段代码(函数),其中我接收一个输入缓冲包作为第一个参数,它的长度作为第二个参数。我正在接收的缓冲区包含一些需要的数据,但也包含一些垃圾值。我只需要打印实际数据(忽略垃圾值)。我该怎么做 下面是(简化版)代码: 假设中包含实际数据+(一些垃圾),我只需要打印“实际数据”,忽略垃圾值。我怎么开支票呢?上面的代码将打印所有内容 提前感谢。首先,您计划如何区分实际数据和垃圾数据 如果调用此函数之前已知实际数据的大小,请在*len中发送该值,对该特定大小执行memcpy()[不要忘记添加尾随的\0以

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

下面是(简化版)代码:

假设
中包含
实际数据+(一些垃圾)
,我只需要打印“实际数据”,忽略垃圾值。我怎么开支票呢?上面的代码将打印所有内容


提前感谢。

首先,您计划如何区分实际数据和垃圾数据

如果调用此函数之前已知实际数据的大小,请在
*len
中发送该值,对该特定大小执行
memcpy()
[不要忘记添加尾随的
\0
以用作字符串]

如果需要在
decodeResp()
内执行检查,请在
中过滤
,计算实际数据的长度,对该大小执行
memcpy()
,然后打印


编辑

您似乎正在通过某个
套接字
接收数据包。您可以利用call的返回值将
*len
提供给
decodeResp()
,以防您使用一些未初始化的缓冲区来接收传入的数据包。

注意:

    char msg_buffer[100]    =   {0}; 
仅将msg_缓冲区的第一个元素设置为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,并且
在buf
中指向“ABCDXXX”,“XXX”是垃圾,“ABCD”是实际数据

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

在调用memcpy之后,
msg_buffer
包含“ABCDklmnop”


如果您现在打印f
msg\u buffer
而不在
中打印f\u buf[*len]=0
,您将得到“ABCDklmnop”作为输出。
in_buf[*len]=0您将获得“ABCD”作为输出。

将“\0”置于msg_缓冲区[Len]位置。如果不是指针,也可以使用Len而不是*Len。请确保复制了正确的字节数,因为在代码中,缓冲区开头有零,并且%s应该可以正常工作。垃圾数据是什么?如果你知道会发生什么,你可以为它做一个过滤器。此外,垃圾数据总是附加到实际数据还是在数据之间?如果附加了它,@Ivanov的解决方案可以很好地工作。还要确保所有符号都是1字节或使用其他数据类型(而不是char)。用strcpy复制字符串。@neeldhawajpathak如果你能分辨出有垃圾,你怎么看出来?在代码中必须有某种方式来描述,当你区分两者时,你在脑海中做了什么。为什么你认为这是垃圾?可能是发射机的问题,而不是接收机的问题。如果它告诉你错了,莱恩,把垃圾放在那里。谢谢迈克尔。只有一件事。你对这个问题有点误解了。如果
in_buf
指向“ABCDXXX”,则我接收的*Len是7,而不是4(*Len包含包括垃圾长度在内的总长度)。这里的问题是,每次调用函数
decodeResp()
时,实际数据长度都会发生变化。实际数据总是字母数字的,垃圾是从内存中取出的一些垃圾。因为在
memcpy(msg_buffer,in_buf,*Len)
msg_buffer将包含“ABCDXXX”,而doing
in_buf[*Len]=0
将位于[7]=0。这无助于我解决问题:)如果长度错误,那么就无法判断缓冲区的结尾是否为垃圾。例如:length=7,buffer content=“ABCD&%231”。在这种情况下,&%ç绝对是垃圾(不是字母数字),实际数据是“ABCD”。但是,如果长度为7并且缓冲区包含“ABCDKLM”,那么会发生什么情况呢?绝对没有办法判断“KLM”是垃圾还是实际数据!。谢谢你抽出时间,迈克尔。非常感谢。@neeldhawajpathak:您可以将数据的实际长度嵌入发送方缓冲区的开头,例如,在前4个字节中。然后在接收方,您知道数据的实际长度。不是“
char msg_buffer[100]={0};”
只将msg_buffer的第一个元素设置为0。”C标准,节初始化:如果括号内的列表中的初始值设定项少于聚合的元素或成员。。。聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。
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);
}