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

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

编辑:说三道四文库 发布时间:2017-04-24 07:52
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?
  或者声明一个特别大的,似乎不太好....:-)
  总之,尺有所短,寸有所长。
  问题分析完毕。










高手爱跨界:联想智能桌面,27寸大Pad抢先试玩 惠普第三季度收入272亿美元同比下降8% 高管重新布局 原来我们会出这个价钱购买“廉价”iPhone Web设计过程中该做和不该做的 新细节披露:通过电信合作 美国75%网络遭NSA监控 实时Bug检测工具Bugsnag发布API更新 【观察】一大三小:亚马逊,微软、谷歌、IBM ,IaaS四足鼎立 “化云为雨”一小滴:北京,3G手机+蓝牙打印机实现智能抄表 金山云与蓝汛联合提供云基础设施服务 MongoDB出新招,增加对Hive的支持 编程语言收入榜 Java排第三 直接拿来用!10段超有用的Git命令行代码 Google Cast SDK正式版发布:自动适配,修复Bug 频受红杉资本青睐,商业智能初创公司Birst靠的是什么? 2013百度世界大会要点精华回顾 WebApp开发框架Clouda、轻应用... 对新手有用的JavaScript开发小建议 磨剑三载,且看从容应对14.3万TPS的Twitter是怎样炼成的! 兰亭集势:被高估的“长尾式采购” 谁说WP手机不行?微软称已成拉丁美洲第二大移动平台 Windows 8之父Steven Sinofsky加盟风投机构A16Z SDCC 2013演讲议题抢先看 腾讯、阿里、支付宝、网易…… [开源推荐]Google开源基于Deep Learning的word2vec工具 【开源专访】DWZ团队:致力打造最简单的Web前端开发方式 Linux黑客车库创业:服务器操作系统CoreOS颠覆互联网 时间序列数据处理的角逐:MongoDB vs. Cassandra 移动周报:Sphinx游戏引擎的前世今生 联想K900评测:英特尔X86兼容性明显提升(组图) 小米手机-HAXLR8on硬件黑客马拉松:32小时的创客狂欢 鲍尔默宣布下台后,微软应该做好这几件事情 IGT张奇伟:从空间物理到博彩游戏研发 Bing即将推出新功能 用户可直接在搜索结果页购买商品 那位有用delphi开发的进销存管理系统的源代码借我参考一下。高分酬谢!!! Phyon net_lover请看 有人说是没有设置sql server的权限,可是该怎么设置呢 我对好女人的看法,欢迎大家提意见! 设置BDE 关于移动的label的问题???? 版主.... sql触发器小问题 谁能帮我解释一下运行时 list index out of bounds(0)这句语句的意思 在一些资料上看到"光栅数据"(raster data)是甚莫数据?与bitmap有何关系? HELP HELP! DataSet中的Tables?? 在一些资料上看到"光栅数据"(raster data)是甚莫数据?与bitmap有何关系? 高手请帮忙---无法删除文件 如何在DELPHI中处理MS Access中的自动编号字段 300分请教:求一公钥/私钥的加密算法 用VB打包的程序未何不能在98下使用 怎么样才能把新闻从一个网站A捉到一个网站B里? 高手进来帮忙! bcb如何创建数据库访问日志? 高手来帮忙 请教:java转换成unicode的方法 关于权限控制和日志文件的问题(在线等候)?????时间紧迫,help me! 关于报表显示的问题? 请问在PB里面发邮件有些什么方法啊?? 报表显示? 请问怎样获得本机网关??? 请教,TextBox绑定到Access的一个数值字段,textbox的内容超过8位时,自动变成了科学计数法表示 用csdn测试一下 在VB中怎样使用滚动条 請教一數據庫同步的問題,給分100,如下: 急急急!!!!请教大家? 嘻嘻,借宝地一用,谢一位朋友,先说明不是倒分贴、不是散分贴;nne998有请 一般大家做查询窗口时,是如何返回查询到的数值的? WIN2K不能启动,提示。。。。。。。。 pb的问题 一个简单问题:进入weblogic console的密码忘记了,怎么办,默认的用户名是什么来的, 怎样在从CWnd派生来的类中响应鼠标消息,象CButton那样??? 求救各位大虾!(重分相送) 关于查询语句 恢复数据库 openrowset语句,请进: C#语法String 如何编写一个速度测试程序 谁有用DataList控件编写的,集修改(编辑、更新)、添加和查询的源程序 我的Win2000坏了,想备份文件出来,硬盘SCSI的,拔不下来,大家帮帮忙,急!!! 有关用asp编写的新闻发布系统!!!! 大家好,一个矢量图编程实现的问题,谢谢! 急急急,150分一个钩子问题~~~~~~~[在线等] 欢迎各位高手参加项目方案讨论? C++ Primer是一本好书,但绝对不是大全 某同学在实验室进行有关浓硫酸的实验,观察瓶上的标签他从瓶中倒出200毫升用于配制成稀硫酸, 表:浓硫酸(H2SO4)500ml 浓度(质量分数)98% 密度:1.84克*厘米相对分子质量:98 (强腐蚀性,阴冷, 一长扁担长1.5m,前端挂300N的货则肩应位于离扁担前端( )m处才能是扁担平衡,平衡后肩受到压力为( )N不计扁担重力 串联电路中电阻越大,电流越大 乙醛溶液与足量的银氨溶液共热的化学反应方程式?离子反应方程式呢? 现有碳酸锰固体,如何制得二氧化锰?除了酸溶解后加强碱 过氧化氢氧化的方法外还有啥好办法 一个串联电路中,电阻器越多(电阻越大)总电流越小,电压越大对吗 13g锌与足量的盐酸反应生成的氢气能与多少克氧气恰好完全反应生成水?这些氧气需要分解多少克氯酸钾才能得到 气锊什么意思 串联电路中,为什么电阻越大,他的电流越小呢?还有,电能和电压是什么关系呢?电源到底是提供电能还是电压啊?我要的不是这个计量式的理由,要的是什么原理造成这一现象 设备在运输过程中,怎样防止气缸活塞杆自由伸出或者缩回?怎样防止摆动气缸活塞杆来回转动?一套设备用到一些双作用气缸,考虑到运输过程中,气缸活塞杆会来回自由活动,摆动气缸上负载也 亚德客气缸中acq与sda有什么区别 串联电路中,电阻越大,电流会变小吗 薄型双活塞杆气缸可以同时向外推么?选用的是DQGI型气缸 在时速100KM的火车上丢下一个苹果,苹果对车厢移动了多少.火车相对地面向前移动了.那么,苹果在脱离手之后,着地前相对火车是移动的吗?理由?落地后相对人移动了吗?理由?是直接把苹果往下 将其直径为4厘米,高为30厘米的圆柱形水桶里面装满水倒入另一个长方形的水箱里面水只占容积的2/3求水箱容积 有人用一根长2.0m的扁担挑两筐重物,前面一筐重300N,肩膀挑在离扁担后端1.2m处,扁担恰好平衡,后面一筐重多少?(扁担所受重力不计) 废气喷淋之后要用活性炭吸附,如何设计这一套工艺,是否在喷淋之后要再加上除沫设备 小车风炮(气动扳手)请问图中圈记的配件叫什么, 一位瓜农用1.2米的扁担挑一担西瓜,前面一筐瓜重350牛,后面一筐重250牛.他的肩应放在扁担的什么位置,扁担才能平衡?若前后筐各减少50牛的瓜,肩应在什么位置扁担才能保持平衡?(扁担及筐的重 带有趾的成语有没有带有趾、比字的成语各一个,趾要含有脚趾的意思,比要含有对比的意思. 雾霾口罩哪种好雾霾天气专用口罩 某同学在实验室进行有关浓硫酸的实验,观察瓶上的标签,他从瓶中倒出50毫升用于配制成稀硫酸.(1)该硫酸未开启前所装浓硫酸的质量为多少克?(2)它将这瓶浓硫酸与2000毫升水均匀混合,所 与这些字意思相同的成语,其两膝相比者 比 右手攀右趾 趾 其船背稍夷 夷 雾霾天气戴什么样的口罩好用 小华同学在实验室配置稀硫酸,观察瓶上的标签.他从瓶中倒出毫升浓硫酸用于配制成稀硫酸,问:这50毫升浓硫酸可以配置10%的稀硫酸多少克? 某水果批发部门将a市水果运往本市销售,有火车和汽车两种运输方式,运输过程中的损耗均为200元/时其他数据如下:运输工具 途中平均速度(千米/时) 运费(元/千米) 装运费用(元)火车 100 15 2 在做高锰酸钾制取氧气时,伸入试管内的导管露出塞子不宜过长,这样做为什么 行同一段路,客车需要3小时,货车需要5小时,客车的速度比货车快{ }% 我现在选亚德客的气缸,没有质量这个参数怎么办亚德客官网上,没有质量这个参数,怎么估算质量啊,这个有关荷载的计算;另外对于气缸我收到的都是侧向负荷,这样的话,气缸的负荷要大于这 想买,烟台打标机,气动打标机,烟台重庆气动打标机,烟台标牌机?想买,烟台打标机,气动打标机,烟台重庆气动打标机,烟台标牌机在哪里买? 行同一段路,客车3小时,货车5小时,客车比货车快?%百分数! 串联电路中各部分电阻不同为什么电流相同 激光打标机于气动打标机区别和特点 无杆气缸多少钱?哪里的无杆气缸便宜? 粉末活性炭有效吸附时间是多少 厦门哪里有比较便宜的气动打标机啊,一般价位在多少之间. 无杆气缸怎么样 粉末活性炭对重铬酸钾有没有吸附效果? 气动打标机的HS编码就是海关编码是什么? 某次雷电电流2*10^4A,电压约1*10^8V,放电时间约0.001s.这次雷电的电功率多少千瓦时?释放多少能 高锰酸钾加热制氧气中为什么试管口下斜拜托了各位 哪里卖:郑州气动打标机,打标机,郑州气动打标机针头,郑州标牌参数刻字机? 亚德克rmt40*100无杆气缸多少钱 1.加热高锰酸钾制氧气,试管口要 倾斜,原因是 ;且在试管口要塞一小团 ,原因是 .采用排水法收集氧气时1.加热高锰酸钾制氧气,试管口要 倾斜,原因是 ;且在试管口要塞一小团 ,原因是 .采 PALL颇尔滤芯 无杆气缸厂家,无杆气缸哪家好? 加热高锰酸钾制氧气时,试管炸裂.为什么 pall滤芯(颇尔滤芯)和贺德克HYDAC滤芯,国产替代的和进口的区别大不大?我们是自己的厂,设备都是用进口的滤芯,太贵了,听朋友说国内有做替代的,不知道质量咋样,有用过的没,现在担心装上 无杆气缸可以垂直安装吗?受力方向平行于运动方向,可以受力吗? 在用排水法收集气体时为什么导管只能刚刚伸入试管是用排水法收集气体.有几个选项,有的导管伸入试管较长,而答案是刚刚伸入试管为什么 在串联电路中用电器中有电阻那么为什么电流还处处相等呢? 某次雷电的电流约2x 10000安培、电压约10的8次方v 、放电时间约0.001s .这次雷电的电功率约多少千瓦?释放多少能量? 排水集气法为什么伸入试管中的导管不宜太长 串联电路中.原电阻小的电器换成电阻大的,电流变化吗? 将二氧化锰沉淀成碳酸锰需要的pH值是多少? 什么是车辆损失险 两用电器串联在电路中,电阻比是3:1,电流比为多少? 氯酸钾与二氧化锰混合后具体的分解温度我知道二氧化锰的催化作用使分解温度降低,但具体低到多少度,请专家赐教.如果与二氧化锰的量有关,最好能有相关的对应数据. 我去年买了一辆车,车价15万元.今年第二次保险,按理说今年的车辆损失险的投保金额应按13万多计算.保险员将车辆损失险的投保金额按10万元算,这样整个保险金额就降低了.我想问的是,车辆损 串联电路中用电器短路后,它的电阻还存在这个电路中吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘