KimilesWood 发表于 2010-7-16 10:26:50

ACE_Message_Block 如何读取包含结束符'\0'的数据

我有一串数据,其中包含了结束符‘\0’,请教一下,如何用ACE_Message_Block的rd_ptr()来读取该数据。比如:数据存放的格式是'hello\0123\0\0\0utrr\0',因为用rd_ptr()直接读取,只能读取出hello来,而其他的却无法读取出来,当然,我也用过rd_ptr(size_t n)来移动指针,再读取,感觉也不大好。请问各位有什么好的办法,先谢了。

winston 发表于 2010-7-16 11:10:59

ACE_Message_Block不关心你里面放的东西,放纯粹的二进制内容也无所谓,所以读取'\0'类型的,当然没有问题,你只要告诉它读取的长度即可完成。

KimilesWood 发表于 2010-7-16 13:15:52

不知道winston指的是否是ACE_Asynch_Read_Stream读到ACE_Message_Block中去,如其read (*mblk, mblk->space ())这个函数,在这里面ACE_Message_Block当然不关心其存放的是何内容。但我这里需要的是将ACE_Message_Block中的内容用rd_ptr取出来,如我的代码为:char* data = mblk->rd_ptr(),其中mblk->length()的长度是正确的,但其取出来的就是就只有hello了,所以我不知道如何来读类似于'hello\0123\0\0\0utrr\0'这种数据。如果winston所指是这个rd_ptr能顺利读取这样的数据,还请指教下,多谢了。

winston 发表于 2010-7-16 13:56:30

这个也很简单啊,你不要直接转换mblk->rd_ptr()到字符串。而是把指针指向的内容直接复制到缓冲区。长度你是知道的了。

KimilesWood 发表于 2010-7-19 18:39:13

非常感谢winston的回复。memcpy我是用过了的,但发现如果只从一个char* 复制到另外一个char*,这个问题是同样有的。后来我用了string.assign(char* ch,size_t len)解决了此问题,但新的问题又出来了,就是assign的长度比较小的时候是没有问题,但如果,实际上我这里是2276字节的时候,assign出错了,只是在release版本出错。debug版本是没有问题的,assign估计分配内存是出错,这个该如何来解决呢?

winston 发表于 2010-7-19 19:24:51

这种错误,据我经验,一般都是字符越界导致。因为按字符串操作,要求结尾0,按2进制操作,则不需要。仔细追查一下边界

Jack 发表于 2010-8-1 02:25:26

嗯, 这个问题在boost.asio中好解决...
asio提供了 read_until如:asio::read_until(sock, buffer, "\0");
建议使用boost.asio.

modern 发表于 2010-8-2 08:38:58

Winston说的没错,ACE_Message_Block不关心内容,
处理好数组越界的问题ACE_Message_Block是非常好用的。

另string.assign我记得代码里是如果大小不够会重新申请内存的。
出错在什么地方,贴个堆栈看看。

andywangcn 发表于 2010-10-31 22:09:32

学习:hug:
页: [1]
查看完整版本: ACE_Message_Block 如何读取包含结束符'\0'的数据