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”
如果您现在打印fmsg\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”,而doingin_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);
}