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

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

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










开创未来的关键:是什么造就了硅谷?(下) 安全漏洞影响2.5万iOS应用?AFNetworking维护者发布回应 《近匠》专访AbleCloud李海磊:IoT平台求变 腾讯、京东、微软等设计专家齐聚,探讨移动应用体验创新设计 TIOBE 2015年5月编程语言排行榜:微软系语言份额上升 《Hadoop核心技术》作者翟周伟 :我与Hadoop的不解之缘 云集百位核心专家 中国云计算大会演讲议题公布(表) 细品这杯香浓的咖啡——阿里中间件高级专家沈询的Java之旅 超图研究院院长李绍俊:创新2.0时代的平台软件研发体系 优麒麟(Ubuntu Kylin)15.04发布派对在天津成功举行 【CTO讲堂】以API为核心的移动应用云大发展时代 游戏设计的迭代误用:从半成品到概念修正 成功的社区在于拥抱变化——知乎创始人周源专访 优化UITableViewCell高度计算的那些事 国外iOS大牛:开发Apple Watch应用我犯过的错 云上Java System Profiling与Debugging——蚂蚁金服观察与实践 搜狗商业平台Java技术实践 Java在电信软件领域的技术实战 关于Java框架Vert.x的几点思考 Java在游戏服务器开发中的应用 Java框架研发思考 那些年,Java程序员用过的开发工具 Java内存模型的历史变迁 Java 8与Apache Ignite Java开发与技术挑战——关于技术的技术思考 专访唯品会架构师肖桦:做编码的架构师 越来越“简单”的Java 我的Java!越过山丘 专访沙梓社:做个“Think Different”的技术牛人 基于ES6,使用React、Webpack、Babel构建模块化JavaScript应用 财税街创始人石克清:创业须空杯心态+有效社交 有一段长时间不能来了,散分 200分轻松拿到,关于CreatePrinterDC的释放,只有几行代码,先放20分,解决后马上补加。 版主!为什么2002年12月31日以前得所有贴子都看不了了?那可是网友们得一笔共同财富阿!! New,CreateObject,GetObject 的区别?? MSInet.ocx可以执行需要其它什么文件? 四川的同仁来说说>? 寻找scjp1。4考试大纲。各位大哥帮忙啊 为什么我的asp,访问不了数据库文件,大家帮忙看看,出错提示见内容!! 求助,如何将一个表里的数据添加到另一个表里. 请问如何在edit(或其他)控件里显示memo里指定行的内容呢? 用CSocket发送网络数据延时问题? 请问如何实现这种功能? 请问各位sqlplus如何获得某个表的主键信息? ADO数据绑定记录死活插不进数据库 网络GIS开发者联盟诚邀软件界精英,共创伟业 仅以此诗献给天下的光棍们.................(转帖) 新年好 在页面添加select option 请问一个MDI基本问题 关于windows2000下打印机安装问题?急!在线等!!!! 打印vb窗体 有什么办法(产品)实现局域网内 IP 同 MAC 绑定,未经绑定关系建立的机器无法实现通信? 谁能给个关于递归的例子? 个人版的SQL SERVER 2000能提供多少连接阿? 网络GIS开发者联盟诚邀软件界精英,共创伟业 dlink网卡不能FTP? 快过年了,打算给父母还有爷爷奶奶买点东西,大家有什么好的建议? asp.net项目启动运行出错,详细信息如下: 怎样判断数据读取完毕? 求ERP的电子书、资料 如何才能做到c/s结构应用程序(pb开发的mis)访问数据库不安装oracle客户端??谢谢 高分请教做服务器,win2000server ???win2000系统,Epson 1600系列打印机,如何找到"自定义纸张"..谢谢 控件区别? 通过一组checkbox来控制按钮是否为disabled 如何通过SQL语句获取我的ORACLE版本号。 在线等,谢谢了…… 应该开个图书交流的版,大家就不必去买那么贵的新书了 ADOTable与ADOquery同步更新问题?? 给你看一张照片,这两人是谁 市面上的delphi的好书怎么这么少呀?哪位ggjj推荐一本好的delphi书籍!! 关于组件和控件的问题。 兄弟们,分数线出来啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! rows菜单update properties下 identity column 列表框作何解? 一个过滤问题 我的系统分析员成绩出来了,气死我了。39,39,55 感觉她作我的GF不错(附照片) 关于excel控件的使用中的第一步 请问哪位有显示CAD文件的组件 用SQL SERVER 2000把数据结构同数据导出到Oracle8i 时 只能够导出结构,why? 忍痛转让 金华天气突变热 25岁小伙上班中风宁波火车东站有人候车室中暑 服务台没宁波酷暑已至用水大增 供水形势严峻宁波机场T2航站楼方案敲定 造型像个杭城昨用电创新高 今夏供电仍有缺口地铁小情侣劝阻中年男人吃东西 被泼豆杭州市民通过高铁飞机出行更便利四季青一家服装辅料店煤气瓶爆炸 三人和睦小学小朋友模拟受伤 提醒孩子暑期杭城今起午后多雷阵雨 双休最高气温下福岛核污水泄漏事态急剧恶化索马里妇女重获驾驶权菲律宾经济二季度增长7.5%平衡“有形”与“无形”之手——海外专法国各政党对是否对叙军事干预分歧大叙利亚局势动荡 周边多国相继提高军事西欧多国对移民亮\"黄色警报\" 部西班牙举办“西红柿节”统计局局长:中国经济“升级版”正在提统计局:第三次经济普查数据发布时间将张高丽:经济普查数据不能带水分 更不国民妹妹IU教你矮个子女生怎么扬长避关于女性的私密部位大揭秘!你又真正的高圆圆&贾静雯:戏里的情敌在戏外却是惊!长期吃苹果的人,竟然会变成这样!足坛“黑店”:波尔图无出其右 摩纳哥小S晒\"臭脸\"照称已便秘两天 网林彬杨:从全国、世界等多个“纬度”规市民政局局长:京津冀协同养老 并非把黑龙江省部分地市“十三五”规划出炉 “爱心红丝带”光伏扶贫 激活艾滋病贫武汉创业者零度低温开跑 漫客英雄现身高清组图:歌伴舞动“绿满十堰”男人骗女人的7句经典谎言!傻了吧!冬天手干易皴裂?小妙招助你解决一切烦心要像伞,撑得开!方能收得起!(深度雪夜温酒人生在世须纵酒,万丈红尘转头空极品兰花,美的醉人雪 | 倾城爱一个人究竟能疯狂到什么程度?朗诵:故乡
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘