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

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

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










还记得DUQU吗?起因可能是Windows中存在了20多年的漏洞! API管理的五大规则 Google也节能:挖角美能源部Arun Majumdar博士 预测:云计算领域的5大变革 CTO俱乐部:移动信息化的创新实践及互联网创业 核心组图曝光:BlackBerry 10明年1月30日发布 “蛐蛐儿”创始人朱连兴:音频二维码的技术实现和应用场景 信恩科技创始人林兴陆:QR Code二维码的前世今生 2012移动开发工具盘点:傻瓜式游戏工具引擎 《福布斯》发布年度“未来之星” 扎克伯格上榜 Cloudera透露Impala发行版新功能及开源计划 Nokia落寞身影下 三星成为全球最大手机厂商 乐视网CTO:智能电视,一个诱人的议题 SeatGeek:Web设计师如何转型iOS开发? IE10支持HTML5标准拖放 IBM IT实践达人赛24强出炉 决赛圈比拼创新实践力 [简讯] Perl迎来25岁生日 软件开发者最重要的四大技能 为什么说惠普、戴尔和IBM在互联网发展中站错队 升级iOS 6还得看Google Maps 2012移动开发工具盘点:16大跨平台游戏引擎 GitHub Web游戏开发竞赛 获奖榜单出炉 Dart里程碑2发布 大幅提升dart2js性能 To Facebook:HTML5不好用?是你不会用! AWS推快照备份服务抵御宕机风险 靠谱吗? 微软品鉴会秀Windows 8电脑 上百款新设备年末上市 甩开外包,雄踞榜首:揭开“宫爆老奶奶”成功的秘密 IBM收购大数据公司StoredIQ 推动大数据传输能力 令人意外:前Windows部门总裁将去哈佛教书 舒迅:产品经理必读的九步法 独家爆料:Facebook移动客户端开发揭秘 请问如何在程序中给DataGrid某个单元格中的超链接列添加javascript? 在我调试程序时,出现了有关"cs3250mt.dll"文件的出错信息,是怎么回事呢,急死我了!!!大家帮帮我吧!!! 急!! 关于Delphi中控件数组的问题 往jbuilder里加文件的问题?怎么找不到类? 我在装有ie6的机器上 写一个程序 调用了webbrowser, 程序在ie5的机器上能不能使用?需要连同什么软件一齐? 想买些delphi方面的书 想在Page1页面中填内容,然后在Page2中显示并保存此内容,怎么实现? 请问win2000下使用的tomcat应该下载哪一个啊? EXCHANG2000如何备份? 急!一个小问题恳请帮助! 请问哪们大哥哪有C语言学习系统3。0的注册机啊~~ 请教各位大哥大姐,数据库备份的详细命令是。。。。。。。 restore数据库时,如果要恢复到最近一次备份,file=什么? 想了解上海9月份招聘会吗? Weblogic,什么烂货! 请问哪们大哥哪有C语言学习系统3。0的注册机啊~~ DNS Server 设置小问题. Rational Robot GUI编程中的HTML的对象如何表达! swat在哪里? 与GetCurrentDirectoryA()相对应的设置路径的API函数怎么写?在线等待! 高高的分,简单的问题! 为会么打印预览的时候老是有“Report width is larger than the paper width” 两个愚蠢的问题,关于ShowModal和右键选择 列表框中有多列,怎样让记录按列对齐? 求助capboy等网络视频播放高手-MPEG-1流的实时网络播放(2) the System V IPC机制是怎么一回事? 无组件上传图片,但我不能控制上传文件只为jpg or gif,请问怎样实现.急,在线等待!谢谢! 关于tomcat 的问题(急) help about windows printer 有关SDK的问题,高手请进! 高分寻求一个例子! dataset更新。100分 请您支招 通配符 有爱国心的高手快去黑了这个网站 这样的字符串比较怎么做?? 怎样在VB中加入动画? 费时操作是如何估计所花费时间的? 为什么我新装的机器在播放声音和视频文件时速度比原速度快了好多? 怎么样清楚Cookies 如何通过一个链接弹出一个没有标题栏,没有菜单栏,没有地址栏等的新页面? 配置问题,在线等待?分不够再加! MFC基础, 如何实现在CScrollView上, 把某一文本文件显示出来(不用file - new)? 求救:请问哪儿有《Beginning Visual Basic.Net》英文书下载??? 高分100 label 控件刷新问题 如何通过一个链接弹出一个没有标题栏,没有菜单栏,没有地址栏等的新页面? 实现这样一个报表??????? 求救。。。。。Access2000的数据库密码忘了,该怎么办呀!!! 动态产生的列表框,如何让记录按列对齐? 为什么有时自动打开网页,有时却不能? 外贸订单上Min.QTY (pcs)是什么意思,快那前面的Min是什么意思啊 怎样知道一块塑料是哪种高分子材料 纳米材料是高分子材料? 哪位朋友知道sodium chlorate purity 99.5% 怎么用炭烤羊肉串过几天准备和朋友们一起去郊游,自己烤羊肉串,该怎么做啊?求详细过程,用普通的煤炭就可以了吗? 纳米材料和高分子材料的区别是什么? 就是想到了,所以就问下问错了别嘲笑我了.就是现在化学里面有个电离,概念有一条是在水溶液下电离可以导电的化合物那么假如有关化合物电离了但是水本身也电离呀然后他两电离的离子就 高分子链结构是什么? 纳米材料结构 怎样测量石块的体积 煤炭比木炭熏烤羊肉串更致癌吗 玻璃门的高度是2.1米宽1.5米,选用离心式风幕机好还是贯流式好,我想买适高3.5米的离心式不知道合适吗?听说离心式噪音小点,风力大一点,我想知道我买适高3.5米的离心式,装在2.1米的高度会不 测量砖块,腊块,糖块,体积方法老师留的作业,让我们回家写 用小苏打水冲洗阴道对身体是否有伤害 穿井得人的译文 测量小石块的体积.测量小石块的体积,量筒放平稳且面对刻度线,诺测量水的体积时仰视,测量水和金属块总体积时仰视,则所测得的金属块的体积将 ()A 等于实际体积B 大与实际体积C 小于实 风幕机哪个品牌最好 英语翻译宋之丁氏,家无井而出溉汲,常一人居外.及其家穿井,告人曰:“吾穿井得一人.”有闻而传之者曰:“丁氏穿井得一人.”国人道之,闻之于宋君.宋君使人问之于丁氏.丁氏对曰:“得一 测量小石块的质量和体积现有一块不规则的小石块,既想测它的质量又想测它的体积,所需的仪器和用品有:____、量筒、水和细线.你认为该先测____(填“体积”或“质量”).理由 请问医生说用苏打水冲洗阴道,请问什么是小苏打啊?就是平时我们生活中所吃的苏打吗?还是什么? 穿井得人的翻译,谢谢. 化工企业应急物质储备有哪些东西啊 如何测蓄能器压力测液压站上蓄能器压力 用压力表如何测? 我烤羊肉串的炉子想用不锈钢打造个,1.3mm厚,烧木炭的,就是担心会不会烧变形了? 为什么糖溶于水后,糖水的体积不变?谢谢了~ 液压上使用囊式蓄能器的问题,系统最大工作压力13MPa,那么使用多大压力的蓄能器?(似乎没有整13MPa或15、16的蓄能器,今天浏览了一下,只有10MPa、20MPa的是吗)对了,另外充入气体压力我届时定 weather wiz kids的翻译 昆明卖风幕机·空气幕的谁知道,电话多少,在哪厂家 液压蓄能器的压力能提升整个系统的压力吗?必须蓄能器3MPA的 麻烦朋友将下面公式改写为通达信的选股公式:要求今天的核能小于昨天的核能{参数 D:34,90,72}VAR1:=MA(100*(CLOSE-LLV(CLOSE,34))/(HHV(HIGH,34)-LLV(LOW,34)),5)-20;VAR2:=2*ABS(VAR1);VAR3:=100-3*SMA((CLOSE-LLV(LOW,D))/(HHV( 南洋风幕机怎么样 蓄能器的调定压力为什么比系统压力高是蓄能器的安全阀的调定压力 求几个同花顺公式:昨日最低价大于前日最低价,昨日最高价大于前日最高价 ,今日最高价大于昨日最高价1 昨日最低价大于前日最低价2 昨日最高价大于前日最高价 3 今日最高价大于昨日最高 哪种风幕机好 EH油系统中高压蓄能器和低压蓄能器各有几个?其作用是什么? 高分子材料的定义如题意 风幕机功耗、噪音市面上有较小型的风幕机么?比空调还小的那种.有的话,这种风幕机的功耗如何?还有,噪音会大么?能给具体点的数据么 请问高分子英文怎么译 我们高分子课上有个individual speech部份,要求用英文介绍一种高分子材料,时间是几分钟.有那些高分子材料比较生活、比较有趣、能吸引大家注意,适合介绍?求推荐! 风幕机哪的最好? 昨日收盘价小于前天收盘价,今日收盘价大于昨日收盘价1%至5%用公式如何表示 高分子材料成型加工的定义是什么 钠可以组什么词 麻烦编个选股公式:今天的收盘价高于昨天的最高价.通达信 GB/T 14975.8-93里的字母和数字什么意思 艾草泡脚有什么功效 英文开始的一个单词怎么拼的?“爱克什”这个音突然一时想不起来了,谢谢. 丝绸是由什么制造的 We have lots of —— eating a new kind of fruit.A .funs B .fun C .funny 发这个音的单词怎么拼 丝织品被染色了怎么处理?是桑蚕丝的衣服 什么化工物品比较抢手?现在做什么买卖都欠钱,确实让人头痛,本人现在不知道干什么事好,想找点事做,对化工比较感兴趣,不知道做哪种比较占优势,像我们这边 有许多化工商店 做PVC的改性剂, the+名词单还是复数…有什么用法 物料是500目的玉米淀粉,用什么类型的振动筛分设备处理量更佳?淀粉很干燥. 缅甸人说什么语言? a an 名词单复数变化 ,出十小题,就是关于a an 的用法,不可数名词和可数名词,例:this is an arm.急用急用 . 直线振动筛回收物料浓度为多少? 夏天用的词语是什么 我想烤羊肉串.烤槽里的木炭怎么点着啊.我以前在自己家里弄时候.把煤烧红了.放到木炭里.一会就着了.现在我想在外面烤怎么能点着啊.请有经验的朋友教一下啊.我是想出去卖羊肉串.用那种 如何在最大限度上降低高频振动筛的物料水分
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘