说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何将MemoryStream中的内容写进一个Char *数组中,又再将char *中的内容写进MemoryStream中?

编辑:说三道四文库 发布时间:2017-11-18 02:36
HTML文档下载 WORD文档下载 PDF文档下载
我是这样做的:
 JpgStream->Position = 0;
 int BuffSize = JpgStream->Size;
 char *Buffer = new char[BuffSize];
 JpgStream->Position = 0;
 JpgStream->Read(Buffer,JpgStream->Size);// 将内存流的内容写到buffer中
 RsltStream->Write(Buffer,strlen(Buffer)+1);//将buffer中的内容写到另外一个内存留中
 ShowMessage(IntToStr(JpgStream->Size));//显示两个内存流的大小,但就是不相等
 ShowMessage (IntToStr(RsltStream->Size)); 

请问各位到底是哪里出现了问题?
你为什么不用SaveToStream呢
char *Buffer = new char[BuffSize];
改成
char *Buffer = new char[BuffSize+1];
是啊!直接使用流啊!
wangxd(东东) 说的有道理,直接使用流就更好了。
我当然知道直接用流啦。
但是,在有些场合,是必须这样先将流的内容存到Char *数组中,再将其写到另外的流中的。
例如,我使用ics的网络控件,它只提供了SendBuffer和ReadBuffer,那怎么直接用流呢?
to luhuogjun:
你说的办法不行。
可能,我没有说清楚。我现在的毕业设计是搞网络的,我曾近试过bcb本身带的NMUDP控件,但是这个控件据说是有不少的问题的,如经常死机(不知是我的程序的问题,还是这个控件的问题,但是网上很多都说这个控件有不少的问题
连delphi 6都不用这个控件的了。我现在决定才用第三方的控件ICS,但是它只有sendbuffer、和receivebuffer。我现在就是在server端把一个memorystream的内容load到一个buffer里再传送出去,再在client将这个buffer重新写的memorystream中去,但是我对memorystream->size和sizeof(buffer)的关系
和区别总是弄的不清楚。请问能将他们之间的区别和联系说得清楚吗?
用NMUDP控件,最近刚写了个Intranet/internet聊天程序下面的代码也许有用
UDPSND->RemoteHost=Fri;
         TMemoryStream *MsgSend=new TMemoryStream();  //发送的数据流定义
         int MsgLen;
         AnsiString Snd;
         Snd=EdtSnd->Text;
         MsgLen=Snd.Length();
         MsgSend->Write(&Snd[1],MsgLen);   //数据流赋值
         UDPSND->SendStream(MsgSend);
         delete(MsgSend);             //释放内存
         EdtSnd->Clear();


AnsiString Rec;
    TMemoryStream *MsgRec=new TMemoryStream();  //接收的数据流定义
    UDPSND->ReadStream(MsgRec);
    Rec.SetLength(NumberBytes);
    MsgRec->Read(&Rec[1],NumberBytes);  //数据流转化为文字
    MemoRec->Lines ->Add(Rec);          //写消息
    delete(MsgRec);                    //释放内存
thx!
呵呵,用MemoryStream啊,简单:
//  来源为 char * s;
TMemoryStream * strm = new TMemoryStream( );
strm->Size = strlen( s );
memcpy( strm->Memory, s, strm->Size );
//  即可

  JpgStream->Position = 0;
  BuffSize=JpgStream->Size;
  char *Buffer=new char[BuffSize];
  JpgStream->ReadBuffer(Buffer,BuffSize);
  memset(Buffer,0,BuffSize);
  JpgStream->Position=0;
  JpgStream->ReadBuffer(Buffer,BuffSize);//这里是将JpgStream写到Buffer中
  ShowMessage(strlen(*Buffer));//按理说假如JpgStream->Size=22000的话,
                               //strlen(Buffer)也应该是22000,但是无论    
                               //JpgStream->Size怎么改变,strlen(Buffer)还是
                               //显示是4
  RsltStream->Size=strlen(Buffer);//那么写到RsltStream中的就只有4个byte
  memcpy( RsltStream->Memory, Buffer, RsltStream->Size);//这句是Raptor提供的
                             //但是情况依旧                             
  RsltStream->WriteBuffer(Buffer,BuffSize);//我自己也找出了解决的办法,就是
                               //~~~~~~这里改为BufferSize,这
                               //样Buffer里的东西,就完完本本地写到 
                               //RsltStream里,但是有时候只知道
                              //char *Buffer里完完本本存有JpgStream的东西
                             // 但是不知道原先JpgStream->Size是多
                             //少,即不知道BuffSize是多少,那将
                             //Buffer写到RsltStream中时就会出现错误
                            //因为strlen(Buffer)老是返回4,而不能正
                            //确地返回Buffer的实际大小。我想这是问题的症
                               结所在。请问各位应当怎么解决???             
    JpgStream->Position=0;
    ShowMessage("Jpg"+IntToStr(JpgStream->Size));
    RsltStream->Position=0;
    ShowMessage("Rslt"+IntToStr(RsltStream->Size));
呵呵,你的这一句有问题:
int BuffSize = JpgStream->Size;
char *Buffer = new char[BuffSize];

注意,在这里,buffer后面,没有字符串后面的0,所以,你在使用strlen(buffer)的时候,就会计算错误。
还有一个问题就是,你的这个buffer里面,你能保证没有0吗?根据你的命名,好像保存的是jpg文件内容,并不是一个字符串,所以,后面的长度计算,肯定是会出问题的。

解决的办法,应该是保存缓冲区的大小,而不应该是通过strlen计算,否则......


呵呵,问题在于该死的Char*类型。
由于字符串总是以\0也就是00结束的。
所以strlen得到的大小就是遇到第一个\0时的大小。
正好jpeg文件的第5个字节就是00。
这样char* buffer的前五个字节的内容就是ff d8 ff e0 00当然大小始终为4。
当然使用strlen永远不会有正确的结果。
我可是来自BCB的:-)  
 回复人:cker(有空就玩票...甭活得忒累...) (2001-5-27 12:47:00)  得0分 
解决的办法是不用char*类型,
你操作的文件流,为什么要用字符串类型  
如果一定要用ICS的话,想通过srelen是不可能得到正确的buffer大小的。
不过你可以在一端先给出传送的buffer大小的值,一道传送嘛。
曲线救国... 
关注
当然有问题啦,首先你用的是strlen来获得的代销不一定是你获得的数据去的大小,strlen获得的是字符串的大小,而你读取的是二进制数据,当然可能会错啦。修改为:

JpgStream->Seek(0,soFromEnd);
JpgStream->Seek(0,soFromBeginning);

int BuffSize = JpgStream->Size;
char *Buffer = new char[BuffSize];
int ReadSize=JpgStream->Read(Buffer,JpgStream->Size);// 将内存流的内容写到buffer中
RsltStream->Seek(0,soFromBeginning);
RsltStream->Write(Buffer,ReadSize);//将buffer中的内容写到另外一个内存留中
ShowMessage(IntToStr(JpgStream->Size));//显示两个内存流的大小,但就是不相等
ShowMessage (IntToStr(RsltStream->Size)); 

to cker:
你所说的也不是没有道理,但是ICS控件和NMUDP的控件不同的是
虽然大家从Buffer里读取信息都是这样的格式
ReadBuffer(void *Buffer, int Count);
但是ICS中响应有信息从远程到达的事件是:
OnDataAvailable(TObject *Sender, WORD Error)
而NMUDP控件响应的事件是:
DataReceived(TComponent *Sender,int NumberBytes, AnsiString FromIP, int Port)
其中NumberBytes实际上就是到达的信息byte数,而ICS控件就没有。
我看它的一个关于UDP的demo(不过只是传送字符而不是象我那样传送数据流),它也是用
这样的格式来读取数据ReadBuffer(Buffer, strlen(Buffer));
但我就是一直都不明白的一点就是假如用ICS来传送数据流的话,ReadBuffer中的Count应该赋什么值才对?
补充一点,我之所以不用NMUDP控件是因为它好像容易引起死机,本来想下载Borland的补丁,但是我在Borland下载的补丁,装到19%的时候会出错的,不知是什么原因。该死的NetMaster公司,又没有免费的NMUDP控件新版本给我们下载哇,真是不知道怎么办?
看了看ICS和NMUDP之后,有两点想对你说:
1》如果使用NMUDP的话,你的情况最好使用SendStream和ReadStream
  BCB帮助里有现成的EXAMPLE。
2》使用ICS的话,倒是没看见直接叫做 Stream的方法。
  你大概使用的是
  Function Receive(Buffer : Pointer; BufferSize: integer): integer;
  翻成C++表述就是
  int Receive(void *Buffer,int BufferSize);
  这里的返回值就是Buffer的真正大小,如果出错返回-1。你所需要的就是他。
  但令人迷惑的BufferSize有代表什么呢?
  原来就是你初始化 char *Buffer = new char[BuffSize];
  ICS要求这个参数的作用是防止内存泄漏,或者说是越界访问吧。
  就是说,收到的Buffer大小超过BufferSize时,Receive停止读取。
  换句话说,返回值永远不会超过BufferSize。
  这里就要求在Server端和Client端有个约定,关于BufferSize的约定。
  大家使用相同的最大BufferSize,以免产生数据丢失。
  如果你的流大小超过BufferSize就分几次发,OK?
  或者声明一个特别大的,似乎不太好....:-)
  总之,尺有所短,寸有所长。
  问题分析完毕。










能携带的网络 Anyfi 150万建网络虚拟热点 又将颠覆产业?传苹果正开发蓝牙智能手表 JavaScript社区开发者调查结果 欢乐淘、求PS大神获腾讯开放平台应用创新大赛年度金奖 2012是响应式设计之年 12月28日:1903年计算机之父冯·诺依曼出生 Android木马病毒:伪装成Google Play图标进行DDoS攻击 IE10 CSS Hack 程序员技术分享:训练机器学习 SVM算法解析 2013,谷歌的数据科学家都将干什么呢? Facebook“也”对服务器进行浸泡冷却 日本最大电脑商:Windows 8表现并不好 日均新增415个应用,Windows 8应用总数突破35000 百度推出图像搜索引擎“百度识图” 可基于图像实现全网人脸搜索 解决专利纠纷 RIM向诺基亚预付6500万 巨头的得意与失落:2012移动游戏十大收购案 Mozilla或许将发布iOS平台浏览器Junior Mozilla:Facebook手机将采用Firefox OS Anonymous2013年将放慢脚步,McAfee预测遭质疑 一周消息树:Facebook公布2012年Hackathon大赛顶级“黑客作品” HTML+CSS+JS 开发 Firefox OS 应用编程实战 前端开发工程师如何在2013年里提升自己 Java受Objective-C影响很大 而不是C++ Instagram回击报告指责:用户仍保持增长态势 回顾:2012年科技行业十大败笔 苹果地图入选 Amazon CEO Jeff Bezos:好年景,大挑战 2012年度盘点:移动互联网大事件回顾 详解Amazon Redshift 移动周报:再见,2012!你好,2013! 英特尔或在2月宣布其电视计划:提供分类频道 Prismatic:用机器学习分析用户兴趣只需10秒钟 上传到服务器的站点出错啊??Global.asax vb+asp.net????????? 怎样让我自己生成的菜单响应消息,并且知道所选的是哪一个菜单? 如何实现“有条件”数据绑定? WriteFile函数写大于4G的文件不成功,请教高手!急 请教高手,关于鼠标响应! 谁来给我举一个回调函数的例子,越详细越好。 DLL全局变量的理解,指导一下,看对不对,谢谢! 500分求助:怎么在windows的user control中加一个参数 java 难题 为什么硬盘不能Format了。大侠们帮忙啊!!! 那位是MS SQL数据库的高手帮帮忙 怎么把int 233 格式位 '0000233' 作好的网页如何让别人能搜到你,帮我呀 如何在vb中通过程序获取计算机一系列硬件信息? 为什么硬盘不能Format了。大侠们帮忙啊!!! OUTLOOK不能发邮件问题!请进! C++Builder高级应用求助!!! 质问斑竹:是谁删了《立法会第一立法案:水源小斑竹选举法》 高分提问! 如何让dbCombobox能接受手动输入值和从下拉框中提取值并存? 和刚才那问题一样,高分! 简单问题 有谁会 我想用treeview,它和outline有什么区别?谁有treeview的例子? 菜鸟问题。 一个建议,赞同者跟贴,请班主置顶并考虑。 菜鸟求教(2) ATL开发出的COM组件封装了ADO功能,在本机执行可以连接数据库,而远程调用COM则连接失败,请大家指点。 在ie里面直接显示Word文档咋做? 高分:Sybase,Win2000安装大问题!!!!(在线等待....) 各位帮帮忙----关于源码控制的问题?????????? 是大虾请帮忙,分很高哟 〖跳跳鼠〗 老鼠转笔刀 关于硬盘序列号! 诚征友情连接 adsl 网关问题!! 加分(我也有一个SQL语句要写,请大家帮忙!) websphere 3.5 和 db2 7.2 的服务器,该用甚么开发环境? 加分(我也有一个SQL语句要写,请大家帮忙!) 诚征友情连接 非常简单的问题 如何用ADO创建一个access数据库(mdb)? 救命!关于Oledb oracle和BLOB的问题!! 怎么在dos下让隐藏的盘现形?十分紧急,很快结贴!!!!!!!!!!!1 散分,同时准备不要这个帐号,如果是新手可以问我要密码 怎么解决窗口最大化问题?高手请进! 救命啊!!关于Paradox记录被锁的问题??? 代码如何实现在web页面上画斜线 向表中插入数据的sql语句该怎么写?急等,高手多多指教啊!! 画点的问题 〖跳跳鼠〗 猫给老鼠的情书 简单的问题,请帮忙解决一下。急,在线等 在逃离火场时,会充满各种各样的危险:烈焰、高温、烟雾、毒气等,下面哪种方法可以减轻或避免伤害?A.在火场中站立、直行,并大口呼吸 B.迅速躲避在火场的下风处 C.用湿毛巾捂住口鼻,必要 从<理想囯>到<正义论>27部西方哲学经典是哪些书目? 绝大多数细菌属于腐生寄生共生自养 “双规”是什么意思? 龙羊峡在: 黄河楸起万丈狂澜 的修辞手法是什么 “长江掀起了万丈狂澜”用了什么修辞手法? 手电灯是多颗灯泡好还是单颗灯泡好说的是亮度和距离 详细解释一下爱是一种什么样的感觉,谢谢 在平静的水面下同样深度处有距离足够远的两只正在发光的灯泡,一只灯发出的是绿色光,另一只发出的是红色光,那么在水面上看到这两只灯发出的光照亮的水面区域那个大?答案是红灯, 怎样躲避密度比空气大的毒气? 韩国抗议日本“竹岛宣传片”日本自卫队逾3万人下月演练“夺岛”(韩国视宣传片为挑衅要日本删视频韩国议员获准访问开城工业园马来西亚一私立学校向金正恩颁发荣誉博中国周边外交发力 区域影响力再提升手机通信遭窥视?默克尔向奥巴马要说法巴基斯坦总理:赶快停止无人机空袭!肯尼迪刺客婚戒将拍卖白宫网页万人请愿辱华节目被删除李肇星:国内一大企业家在欧洲浪费粮食纳豆机免费申领鲁能“五虎”助阵国足为保世界杯安全巴西政府投入8亿美元武汉宣传部长离任前突击提拔干部韩国男神更新快哪款才是你最爱醉酒后与“的哥”互殴两男子获刑各市发公文需制定数量控制线印度南部成立新邦CBA何时才有职业裁判?乌各方签署解决危机协议丢了金牌 赢了世界
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘