找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6979|回复: 8

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

  [复制链接]
发表于 2010-7-16 10:26:50 | 显示全部楼层 |阅读模式
我有一串数据,其中包含了结束符‘\0’,请教一下,如何用ACE_Message_Block的rd_ptr()来读取该数据。比如:数据存放的格式是'hello\0123\0\0\0utrr\0',因为用rd_ptr()直接读取,只能读取出hello来,而其他的却无法读取出来,当然,我也用过rd_ptr(size_t n)来移动指针,再读取,感觉也不大好。请问各位有什么好的办法,先谢了。
发表于 2010-7-16 11:10:59 | 显示全部楼层
ACE_Message_Block不关心你里面放的东西,放纯粹的二进制内容也无所谓,所以读取'\0'类型的,当然没有问题,你只要告诉它读取的长度即可完成。
 楼主| 发表于 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能顺利读取这样的数据,还请指教下,多谢了。
发表于 2010-7-16 13:56:30 | 显示全部楼层
这个也很简单啊,你不要直接转换mblk->rd_ptr()到字符串。而是把指针指向的内容直接复制到缓冲区。长度你是知道的了。
 楼主| 发表于 2010-7-19 18:39:13 | 显示全部楼层
非常感谢winston的回复。memcpy我是用过了的,但发现如果只从一个char* 复制到另外一个char*,这个问题是同样有的。后来我用了string.assign(char* ch,size_t len)解决了此问题,但新的问题又出来了,就是assign的长度比较小的时候是没有问题,但如果,实际上我这里是2276字节的时候,assign出错了,只是在release版本出错。debug版本是没有问题的,assign估计分配内存是出错,这个该如何来解决呢?
发表于 2010-7-19 19:24:51 | 显示全部楼层
这种错误,据我经验,一般都是字符越界导致。因为按字符串操作,要求结尾0,按2进制操作,则不需要。仔细追查一下边界
发表于 2010-8-1 02:25:26 | 显示全部楼层
嗯, 这个问题在boost.asio中好解决...
asio提供了 read_until如:asio::read_until(sock, buffer, "\0");
建议使用boost.asio.
发表于 2010-8-2 08:38:58 | 显示全部楼层
Winston说的没错,ACE_Message_Block不关心内容,
处理好数组越界的问题ACE_Message_Block是非常好用的。

另string.assign我记得代码里是如果大小不够会重新申请内存的。
出错在什么地方,贴个堆栈看看。
发表于 2010-10-31 22:09:32 | 显示全部楼层
学习:hug:
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 05:24 , Processed in 0.023959 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表