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

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

编辑:说三道四文库 发布时间:2017-09-22 03:40
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资料 增强DelphiTStatusBar控制 制作Delphi的竖排标签 自适应表单的实现-Delphi资料 COM/DCOM的区别与联系-Delphi资料 CoolBar上控件的排列顺序-Delphi资料 Delphi 4 WebBroker Delphi 中自做动态显示的控件 Delphi3的DBGrid中的下拉列表和查找字段编程方法 DELPHI常见问题 Delphi的竖排标签 DELPHI构件制作方法 DELPHI控件Tweblabel的编制 DELPHI中MEMO组件的光标定位 Delphi中RichEdit的奥妙 Delphi中TApplication类 Delphi中日期时间输入的简洁方法 delphi中怎么调用interbase数据库? Memo的Undo功能-Delphi资料 RECT在Delphi中的灵活使用 StringGrid制作只读列-Delphi资料 TADOQuery下主明细表其属性关系如何设置,如何保存主表和明细表?-Delphi资料 TBatchMove用法-Delphi资料 TMemo的真正插入字符-Delphi资料 TREEVIEW的使用-Delphi资料 TreeView在电信综合统计管理系统中的应用-Delphi资料 VB6.0动态加载ActiveX控件漫谈-Delphi资料 捕捉来自 Thread 的异常-Delphi资料 定制Speedbar-Delphi资料 动态产生构件并相应事件-Delphi资料 对Borland可视部件的一处改进-Delphi资料 今天打开邮箱,竟然没有lj邮件,感动ing,散分ing 4、五一散分帖,问问题。:) 单击一个TreeView发生一个事件!我想显示? informix小问题 求一个存储过程,sql server 2000 大家好,请高手赐教,有关在应用程序中如何打开并编辑Word 文档??急需 如何在文本文件中查找一个串 100分,如何安装sturts?解决马上送分 求急! JMAIL组件的收邮件附件的问题,请熟悉JMAIL使用的帮忙看看。 高手请指点..急呀..在线等... 请问怎样固定一个窗口的大小? 请问用正式版能不能修复已过期的sql server 试用版,让它重新启动起来? Asp.net怎麼執行存儲過程﹖是不是用存儲過程執行就不會出現臟數據﹖ ERWin是个什么东东? 键盘响应(F1) 怎么样把一个目录的权限完全给指定的user? 分布式数据处理问题-Sqlserver 开发人员请指点!! 判断数字问题 谁有刷新隐藏帧的例子? 我做的第一个网站,大家去看看,多提宝贵意见,谢谢! 请帮助 我是一个初学者,在学习深入浅前MFC有一些看不懂,我应该先看看什么? 求助 请介绍几个Tuxedo的网站、论坛 IIS服务器与ORACLE数据库在一台电脑上连接没问题,但是将其分开各占一台电脑后联接就失败了!为何? 通过什么函数获得float型变量的整数部分呢? 怎样使工具条和菜单条可以用鼠标按住拖动? TEXTAREA不可以填默认值进去吗? 菜鸟求助 oracle数据库连接池的问题 vc控件窗口 真奇怪,treeView 双击事件老报错,请高手看看,是不是csdn搞错了 请问,刚刚装的SQL SERVER2000 是不是需要配置? Finding SQL servers that does not broadcast on the LAN 请问这个SQL语句该怎么写?在线等待,马上给分~ 请问如何让listview具有单选功能??就是选中一条后该行就变兰? 5、五一散分帖,大家说一个比较好玩的地方:P Huffman 编码的译码方法??? 求助学习SQL server 的网站 寻找access数据库书籍电子版 有关redo log的archive,哪位能帮我解释以下Oracle Alert messages显示的信息? 谁来救我!!!谁有TreeView关于VB.Net的代码 有分送!!apache和tomcat怎么样整合,我想要简单一点的方法。 哪位仁兄告诉我Numega TrueTime的下载地址,给100分 std::string 和c-string 的问题 新手问题,十万火急!! 新手问个苯问题关于记录集(40)在线求 如何将EXCEL数据导入到SYBASE数据库中? 做asp程序员能拿多少钱?~` 有助与提高自己的想法,,征集!!! omniverse和十维空间是什么关系,两者概念相等么?还是说哪个比哪个的概念要大? 电磁场相当于无线电吗 到底成吉思汗杀了多少人 一些单词的特殊变形1、形容词变副词的特殊变化.比如说,gentle变为副词是去-e 直接家y2、 名词变动词的3、形容词变名词的4、进行时的、过去式的5、还有一些常错的 东大的电磁场与微波为什么分数线低(相对无线电系其他方向) 怎样测热敏电阻阻值 当陷入逆境时,我们应该采取什麽对策呢? 等离子武器厉害还是粒子束武器厉害```?比如电浆枪或高射粒子炮 同步带HTD和MTD有什么差异 在水准测量中,什么叫后视点,前视点和转点?水准测量成果共有几项检核?如何进行? 无线电技术 放冰块在大塑料袋里,然后又在一个塑料袋里放牛奶再把两个塑料袋重叠起来,一直摇,会摇固体吗? UG CAE比ANSYS 的CAE好在哪里 水准测量中单程双测是什么意思 现在都有哪些理论 就像牛顿定律 还有相对论之类的? .霍金说我们的宇宙是泡泡内部高维空间投射在四维时空中的全息图,那是不是说明宇宙不是膜碰撞产生的霍金在膜的新奇世界中说宇宙是泡泡, 佝偻者承蜩的主旨句 相对论是一个定理还是一本书? 霍金是不是将M理论中的膜比作泡泡如果是膜与泡泡有何区别 已知直线L经过点A(-5,6)和点(-4,8),求直线的一般方程式和截距是方程 一百度时,热敏电阻阻值为一百欧,电压表示数为三伏,零度时,热敏电阻值为五百欧,电压表示数为多少? 请你设计实验验证加入铁芯的通电螺线管的磁性大大的增强只要第一个回答的绝对采纳 但不能太离谱 镁的蒸汽能不能在碳中冷却 热敏电阻在0度和100度的电阻分别为200千欧和10千欧姆.试计算该传感器在20度时的电阻值. 一种商品提价10%后,再降价10%,现价是最初价格的( )% 】俄语习题单词变形.将括号里的名词和代词变为适当形式.只把正确形式帮忙写出来就可以了. 山东菏泽市有几个县都叫什么 我国几月收割棉花? 请教几个英文单词的变形交互 interact集成 integrate导航 navigatexx具有"交互性""集成性""导航性" 这三个词怎么表达 山东省菏泽市定陶县人口有多少 棉花几月份收获 霍金的大设计是不是阐述了M理论,是不是将宇宙比作泡泡 一种商品打九折,获利300元,打八折,仍获利200元,求进价 棉花每亩能收获多少11月26日,河南省南阳市唐河县部分棉企籽棉收购价格为3.65—3.7元/斤(弱3级、衣分39%),棉籽价格为1.50元/斤,弱3硬4级皮棉销售报价为15200元/吨 这是最近的价格 每亩能收 霍金在大设计这本书中写道无中的涨落形成泡泡这个理论阐述的是M理论吗 光与时间与恒星人们看到的是不是由光反射到眼睛所呈象的请问 一个距离地球300光年 的星星 我们所看到的他的景象 是不是由光传播了300年 呈现到我们的眼前的?那意思是说我们看到的 和物 人真的是要有压力才可有更大的动力吗 热敏电阻在0度和100度的电阻分别为200千欧和10千欧姆.试计算该传感器在20度时的电阻值. 恒星有几个时期? 水准测量外业中有哪些检核方法?各自的测量精度为多少? 霍金在大设计这本书中写到无中的涨落形成泡泡这个理论阐述的是M理论吗 恒星落下时间,急求!恒星只要是大家熟知的就好,比如:天狼星、织女星...之类的,请知道的人告诉我! RSV是什么意思?拜托了 三角带轮大小该怎么选择? 霍金在大设计这本书中写道无中的涨落形成泡泡,这个理论是不是在M理论的框架内虽然m理论还没有完成但是大设计对 M理论有比较大的展望,我觉得霍金在大设计这本书中写道无中的涨落形成 请问RSV计算详细问题、RSV计算中(N日收盘-N日最低)/(N日最高-N日最低)*100=RSV那么请问、N日是什么意思?该用什么方法来理解、并且用怎么样的数字整合代入? 我渴望得到更大的压力.我的题目作文是写在一次考试中把压力化为了动力.最好取的好成绩.这样的选材和构思好么? 燃烧海绵能产生让人晕眩的气体?为什么? RSV值3日平滑移动平均线怎样求要简单点的. 电磁场是啥? 山一程,水一程表现出 ,风一更雪一更渲染出 有志不在年高的修辞手法是什么?有志不在年高,无志空长百岁修辞手法是什么? 向电磁场是什么向电磁场是电磁场? 海绵燃烧产生的气体对人有什么效果 十一维空间是什么概念? 一个词的变形아프다+니까 就可以直接变成 아프니까 还是需要变形什么?以此类推,是不是所有以ㅡ结尾的都这样?比如说쓰다,크다. 山一程 水一程 絮已为萍风卷叶 深夜灯火明 风一更 雪一更 离人偏识长更苦 却道相思情 这首词还可以吗虽然有前人的句子,但是我是照着我的心情写的喷的别来 有懂这些的前辈们给指点一下 单词变形1.possible(adj.)→_______(adv.)可能地;也许→________(反义词)不可能的2.final(adj.)→______(adv.)最后3.anxious(adj.)→_______(同义词)焦虑的4.own(v.)→_______(n.)所有者;物主5.create(v.)→________(n.)生 冷轧碳钢板卷是 碳钢产品吗?还是特殊钢产品 宽厚板呢? 谁知道成吉思汗的生平? 南京“礼让斑马线”行动满月 109人黑龙江非转基因大豆产业遇危机:加工一苏州一公交司机工作时猝死 安全停车2专家:房产税遗产税的推出应逐步探索小狗“旺财”被遗弃后痴等主人 从春天实拍!迪拜七星酒店上的高空原地转圈烧四川竹溪村十余年频现盗尸 24小时守欧盟成立20周年一体化频遭挑战 经济中国珠算进入2013年联合国人类非物日本最新型潜艇“黑龙”举行下水仪式俄八旬老汉野外斗熊 被摔下悬崖后逃出索契冬奥会火炬将由14架直升机护送入加拿大首设“比特币”ATM机 被批缺偷渡惨案再现撒哈拉沙漠 尼日尔发现8“监听门”持续发酵,美国扮演“地球网Google建造数艘集装箱货船引发猜荷兰边城见证《马约》风雨20年美国全球监听引发网络空间深刻变化中国军医表现突出 荣获厄瓜多尔最高荣党报刊文称回避养老双轨制其他改革恐难北京“10·28”事件受伤人员得到全想创业再娶嫩妹纸不是梦海尔U+创客大时空猎人魅影女王失落帝国闯关视频教程Uber将在中国6个城市上线拼车服务多图|记事不用手机:九大品位记事本震荡调整后,明天会上扬吗?从骄傲到谦虚的情怀:坚果手机开箱图赏全民枪战怎么得钻石 获得钻石的方法青少年对抗赛 横跨太平洋的纯真友情这种游戏字太多,不玩!甘世振:白银下探重回弱势,原油高位盘听说你不想上班,想成为自由职业者!炉石传说新版节奏法卡组 无限法术的卡冒险岛手游海盗爆莉萌天使属性加点表NPD:美国手机游戏玩家人均在1.6远程效果拔群 火影忍者手游天天试玩视自由之战海伦天赋加点 海伦天赋怎么加我也爱我的孩子, 可是我却不如他爱我炉石传说全民石力赛京津比赛地点变更海岛奇兵哈莫曼反击分析 哈莫曼反击介炉石传说暴雪嘉年华中国锦标赛决赛说明炉石传说动国服第三卡组 物园卡组说明
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘