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

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

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










如何用Delphi编写自己的可视化控件 如何用VB创建控件-Delphi资料 生成程序组和项-Delphi资料 实现超级链接-Delphi资料 实战Delphi数据网格色彩特效 使dbgrid的某几笔资料变色-Delphi资料 树形图(Treeview)的使用概述-Delphi资料 透明FORM-Delphi资料 为列表框添光彩-Delphi资料 限制FORM的大小-Delphi资料 用Delphi开发分隔线组件 用Delphi设计拨动、跳线开关组件 用Delphi 设 计 拨 动、 跳 线 开 关 组 件 用Delphi实现JPEG格式图像的显示 用Delphi制作动态有声标签 运行时生成控件-Delphi资料 在DBGRID中实现COPY、PASTE功能-Delphi资料 在Delphi程序的About窗口中建立URL连接 在Delphi中利用Tbatch组件完成数据批处理 在Delphi中巧改窗体文件实现控件数组化 在Delphi中实现不同风格的SPEED和BUTTON 在Delphi中实现类似VB中的控件数组。 在RichEdit中的串查找-Delphi资料 在按钮中快速启动程序-Delphi资料 怎样读出MEMO控件的当前值-Delphi资料 怎样使用Delphi 5中的TExcelApplication操纵Excel 97/2000 怎样在TDataset中汉英混用-Delphi资料 制作可移动的窗体的MovePanel控件-Delphi资料 制作可移动的分割窗体-Delphi资料 制作用于日期时间型字段的DELPHI数据感知控件 制作主窗口显示前的版权窗口-Delphi资料 急!急!关于菜单中变量的引用 怎样调用其他程序,并模拟鼠标按下那个程序的确定键 我在控制台上为什么添加组策略的时候,添加不上"本地计算机",找不到这一项, csdn现在可真烂!!!速度如牛,劲道却赶不上牛,找个昨天发的贴子都是问题,太差!!! 为什么当我在调试atl开发指南中第入章的例子的时侯没有错,而当我在activex control test container中调用确。。。。。 作一个局域网内的类似QQ的东西,用JMS好不好? 谁知道Tao Group的ElateOS,欢迎讨论。 大家说将来是考MCSE认证有用,还是考JAVA认证有用? searching..................... 如何获取数据库的连接数??? 我正在编写一个读写、显示、编辑位图的软件,请大家给点建议!(进来的均有分) 请问各位在把基于access2000的asp移植到sql7.0是要注意那些问题啊?(大家交流交流经验) 请帮帮我 菜鸟先报个到 大家好,这个问题好几天了都没解决,小弟分不多,能不能帮帮我 mysql中怎样设定远程访问权限 各位QBasic大师,能不能提供一些使用qb编程的技巧? 不胜感激! 弱水请进:oracle的REDO日志人间丢失,试图恢复时告诉我system.dbf需要进一步RECOVER,有没有好办法? 各位QBasic大师,能不能提供一些使用qb编程的技巧? 不胜感激!! 怎么把一个文件的内容读入到RichTextBox jtree问题:怎么以“我的电脑”作为根结点,小妹只能取得根结点系统根目录(c:\等),如能帮忙或给有用提示,高分相报,大家请进 送分题来了!!!!!!!先到先得呀!!!! 请教关于ListBox的问题! datagrid的一点讨论! 请问vc高手:word中的字符缩放是怎末实现的? 窗口刷新问题,急 请教各位一个delphi的初级问题。 有什么函数可以得到一个字符串的charset,或者是有什么别的方法? 偶使用pb,想做多文档界面,在下拉菜单里的click事件中怎么写,才能跳出一个窗口?//牛虻 这个sql语句怎么写,谢谢 绝对有挑战性的论题,大家不妨试试。(高分相赠) 数据库应用程序的一些问题 没事做!无聊中....... rami(瓦西里.扎伊采夫)请看... 什么叫:定义函数入口参数结构,如何定义呢? 这一个什么进程???? 不难但是很烦的问题。 有女生吗?女生近来给分!哈哈~~~~~ 请问如何在appliction中显示数据库中的图片--〉〉〉〉〉〉〉〉急急急急急急急急 請版主幫忙結單 请问什么是嵌入式开发???我现在正学51系列单片机,应如何理解嵌入式开发? 怎样判断再三个表中同一字段的数据是否重复?????? 请问有哪些工具可以远程控制oracle数据库? 哪里有正版操作系统等软件下载? JAVA程序编译时,有时会提示你要用try...catch...,JAVA怎么知道我要用try,有个标准吗? 关于unix下的双机热备问题。急!!! 靠,用classwizard时为什么只有ctoolbarctr而没有ctoolbar? 高分求救:在word中有没有自动插入行号的功能????? 报表问题 Access97 中取几位小数用哪个函数,round不能用?或着有什么其他的方法,谢谢 h---e---l---p????flash播放插件 巴基斯坦11月份的温度及气候 混凝土的单位容积质量 一块石碑体积为5立方米,取一小块作为这块石碑的样品,测得它的质量是130g,用量筒装100立方厘米的水,再把石碑样品完全浸入水中,水面升高到150立方厘米处,求整块石碑的质量. 一个圆柱形容器得容积为v立方米`开始用一根小水管向容器内注水,水面高度达到容器高度3分之一后`改用一根口径为小水管3倍的大水管注水`向容器中注满水的全过程共用时间t分,求两根水管 混凝土质量配合比、重量配合比、体积配合比区别 有一块石碑,体积为50立方米,为测定其质量取一块50立方厘米的石料做样品,质量为 电容单位能和电流单位换算吗?电流是A 安培 电容是F 法拉.它们的单位不同但都能让灯亮,单位能换嘛?怎么换算的? 美国佛罗里达州的杰克逊维尔Jacksonville是在海边吗?气候如何呢? 根据混凝土密度和质量求体积和直径的问题混凝土的密度是2.4吨/立方米,我要做一些直径0.45米的圆盘 质量分别为 25千克 20千克 15千克 10千克 5千克请大家帮我算算他们的厚度各应该是多少 电流单位换算1.0.65A=___mA=___微安2.480微安=___mA=___A3.480mA=___微安=___A 为什么美国发生雷暴天气最多的地方是佛罗里达州 根据混凝土密度和质量求体积混凝土的密度是2.4吨/立方米,我要做一些直径0.45米的圆盘 质量分别为 25千克 20千克 15千克 10千克 5千克 请大家帮我算算他们的厚度各应该是多少 初二物理电流单位换算.1A=?mA 15uA=?mA=?A 顺便问下mA,A,uA这三个单位怎么换算? 美国南佛罗里达州的的天气?主要想要一个确切的答案?是热带还是亚热带还是其他什么的天气, 一个蓄水池,每分钟流入5立方米水.如果打开6个水龙头,2小时 就把水池放空 ,如果打开8个水龙头,1小时就把水池放空.现在打开12个水龙头,问要多少时间才能把水放空? 湘教版 美国气候最好的州是什么?不去夏威夷.气候比较像中国偏南但不是边境地区的气候.资金不需要N多N多的那种.且周边城市都有很多好大学的. 一个蓄水池,每分钟注入4立方米水.如果打开5个水龙头,2.5小时就把水池放空,如果打开8个水龙头,1.5小时就把水放空.现在打开13个水龙头,问要多长时间才能把水池放空. 美国的纽约,洛杉矶等大城市比上海好在哪?或者是上海比美国这些大城市差在哪?上海在美国各大城市里能排在上,中,下什么位置?嫣然意态翩然妒,他们的物质生活条件,也绝对令大部份中国人 美国50州的气候,分别和中国哪个省(市)相似?如果找不出中国的对应,就写个全年温度范围.回答样板(仅举例):佛罗里达州----海南省明尼苏达州----黑龙江省... 请问美国俄亥俄州现在是什么气候?大概多少度? 交流发电产生的电流可否是线圈通电成为电动机,这样能否一直旋转 曲轴位置传感器有那些种类?它们有何作用?进气压力传感器的作用是什么? 美国的气温多少度?怎么翻译? 煤炭发电产生哪些污染 美国是什么天气我看暮光之城他们在海边捂的那么严实 跟冬天似的 但是在学校穿的短袖的跟夏天似的 就算是海边冷点 但是这个差距也大了点吧 为什么现在欧洲、美国和我国京津冀地区会出现极寒天气? 由发电机,带动电动机,形成永动机.物理由发电机带动电动机形成永动机,热能消耗由齿轮 滑轮省下来的力填补,形成发电机电动机能量互相转化,最终形成永动.你们应该明白了.如果不成,请找一 美国大部分位于 之间,以 的气候类型为主 相同质量冰和水转换体积关系 高中地理必修一知识点 美国的环境是什么样的?美国环境好不好呢? 凸轮轴位置传感器分为哪几种? 高中地理必修1的知识点 美国环境怎么样? 什么是体积单位和质量单位这么换算 中国的环境真差你们看看,中国人素质真是.道德.人品 人格 尊严.咳 汽车凸轮轴位置传感器的作用是什么? 这是凸轮轴位置传感器吗 一个圆柱形容器的容积为V立方米,开始用一根小吸管向容器内注水,水面高度达到容器高度一半后,改用一根口径为小水管2倍大的水管注水,向容器中注满水的过程共用时间t分.求两根水管各自 凸轮轴位置传感器有什么作用? 凸轮轴位置传感器坏了有什么情况 电动机的反向电动势有人解决了吗? 凸轮轴位置传感器的作用是什么? 市售的“脑黄金(DNA)”是从深海鱼油中提取的,主要成分为一种不饱和脂肪酸,其化学式为C25 H50 COOH.它是由______种元素组成的,每个分子中有______个原子.已知1个氧原子的质量测定值为2.657×10^(-26 电动机工作发电不电动机工作是切割了磁感线对吧 那么电磁感应现象因该会产生电的啊 化学什么叫摩尔和物质的量 原子分子,质量分数今年春季以来,甲型H1N1流感疫情在一些国家持续蔓延,用于治疗流感的抗病毒药物“达菲”可有效的预防和治疗甲型H1N1流感.从烹调香料八角中提取到的莽草酸(化学式C7H10O5 美国 11月份 温度与气候 "美国夏天的天气怎么样"的英文 一道初三的化学题关于原子那章某原子含26个质子,相对原子质量为56,则该原子中的粒子总数为?A 26B 56C 52D 82因为今天才开始讲这一章节,有太多不熟悉的地方,麻烦写出是怎么算出来的.还有原 美国11月天气从11月1日至11月30日天气变化和温度情况 美国阿肯色州夏天气温 甲原子与乙原子的质量比为a:b,而乙原子与碳-12原子的质量比为c:d .求甲原子的相对原子量.加上讲解更好.越快越好, 河南11月份气候温度是多少度我这两天要从广东去河南,请问大家河南的天气情况,都穿什么比较合适 美国以什么气候为主 有一石碑,体积为30立方米,现从同一石料上取一小样品,质量为140克,将样品浸没在原来盛有100毫升水的量筒中使水面上升到180毫升处,求此石碑的质量. 11月份中旬要去台湾8天,请问那边的气候和温度怎样? 混凝土的质量比和体积比是多少是混凝土自身的配合比不是质量和体积比 一石碑,体积30立方米,为知道它的质量,取小块样品,测出质量140克,量体积50立方米,求石碑质量.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn