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

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

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










微软将WP周期延长至36个月 明年推企业功能包 Gartner:全球PC出货量二季度下滑11% 联想成全球最大PC厂商 用来简化开发任务的20个JavaScript类库 煎饼,娇妻,Belief:黄太吉的移动互联网营销 AWS大降价:最高打两折 推荐十款超赞的Google Chrome扩展插件 在团队中进行单元测试/TDD的12条经验 小米游戏中心6月数据报告:页游转手游怎么搞? 司机请专心:安全是车载APP要解决的大问题 Windows 8之父Steven Sinofsky:跨平台开发会为什么越来越难? 一些达成共识的JavaScript编码风格约定 语义技术——微软、谷歌和Facebook的必争之地 初创公司PlumGrid:前思科工程师的“逆袭之战” Firefox OS智能手机继续扩张 德国市场今日开售 如果让莎士比亚、海明威编写JavaScript代码 开源的数据可视化JavaScript图表库:ECharts 已迭代1.3亿年的分布式系统——Anternet 软硬整合:14个可改变世界的Kickstarter项目 是时候放弃MySQL的五大理由 比特币钱包Coinbase推出即时交易功能,无需银行转账手续 回收不活跃邮箱续:雅虎高管称能保证前用户信息和数据安全 移动周报:IT民工携娇妻转战传统行业,黄太吉的移动互联网营销 独立游戏开发的传奇!LIMBO开发商Playdead公司CEO专访 Firefox OS模拟器4.0正式发布 支持模拟触摸事件 莫轻言已成功部署大数据,也许你离达标还相去甚远! 基于Java的四大开源测试工具 Firefox OS:称霸移动市场?我们的计划更长远! 支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现 传苹果为iWatch招兵买马 以确保明年发布新产品 降价高达1200元的Surface RT,并不值得你购买 Daux.io:开源的项目文档生成器 唉~ 我都21了 刚中专毕业 我可咋整啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 如何用VC做不规则形状窗体 是蜜月?要我一个月搞定软件下载,怎么办哪? 在VC中,分割窗口CSplitterWnd是否可以将卷滚条去掉 请问,如何动态向select(下拉列表框)中添加项目,另外,如何取得当前的选项 用INSERT ROW在表格中插入记录 关于CTreeCtrl的SortChildrenCB函数调用的问题 求教将文本格式化输出的代码 急需英文WIN2K+多国语言版, 各位专家们,可知道Acer的笔记本用的可是台式CPU? leeyansheng(风妖精) 在不在???刚看见你。怎么还没睡? 请教:我安装完flashget后,可是我要下载文件时,点击时默认的不是flashget,还是一般下载的那种,不知道该如何解决?急 请问为什么不能在dns中创建新区域 怎样控制键盘灯 OK,过足疯瘾了,开始 CODE 那位好心人介绍几本关于 java 的书? 急!!!各位高手,能否帮忙做个流程图,谢谢各位! 如何做一个真正的屏保? 中文Win2000与中文win98在使用CDC::Arc上有什么不同吗? 如何完全控制鼠标 35分任你拿 skyyoung 、 kookoo 、 BrentIvan 、 mshy 四位大虾,请留下email,小弟有要事好事通知! C#适用于开发大型的应用系统吗? 哪位有二手笔记本卖 孤独大哥还在吗?有人找! 请教一个高级问题!!! 怎样把帮助文件(.hlp)转换为和执行文件(.exe)。 关于ACCESS用SQL SUM的问题 怎样在csdn发布自己的软件 谢谢大家的回复.我已经知道可以建立个autorun.ini的文件.内容为(但是还有一个问题...) 菜鸟问题:如何删除一个里面有文件的目录? 我的大梦 API初学者的问题!!帮帮忙!!谢了!!! 那里有《ATL开发指南》第二版 电子工业出版社 下载(高分) 本人编制了一份“使用BCB5进行多国语言开发”的文档,希望对大家有用 ==================月薪8百,招聘VC通讯编程高手72名,要求待遇进来看.============== 展示程序,有原码,只邮前50个。 不对啊!是不是电脑报出错了?? win2000菜鸟问题. 那种包月可比较合算? 变量累加奇怪,奇怪,奇怪!!! 有什么办法能刻录一个大于一张光盘的文件到两个光盘,且拷贝回硬盘时能自动提示插入下一张碟,使文件还原? 用delphi5.0写的ISAPIAPP的程序,上传到INTERNET服务器后数据库的访问路径如何设置? puffdream(911) 同志请进 一个关于api函数的问题? 紧急求助:如何去掉PDF的打印限制 用什么编辑器? JInternalFrame!!!!!!!!!!!!为什么!!!!!!!!!!! 一个关于DrawGrid和Ansistring的问题 想学VC++从哪开始,API、MFC、VC6 如何去掉PDF的打印限制 ---------管理员!管理员!csdn的广告条上那个"波斯猫"mm是谁?----------------- 1纳米等于几米 a的12次方减去a的6次方等于几? 4/3.4/3等于多少? 1纳米等于几分米300升=()立方厘米50立方毫米=()升=()升0.5立方米=()立方分泌=()立方厘米10小时=()分=()秒900秒=()分0.4小时=()分=()秒150分=()小时=()秒 0.25的10次方x2的20次方 1+2+3+4等于几 五十纳米等于多少米? 0.25的50次方×256的10次方×(-2)的20次方 5吨的3分之1等于( )的2分之1? 50纳米=( )米 计算(-0.25)的5次方×2的10次方 三尺六是多少厘米 十字相乘计算x^2-3x+5就是化成(X+Y)^2的形式 25米等于几纳米 -0.16次方怎么计算? 因式分解2(x²-x)²-3(x²-x)-20【用十字相乘法】 100微米等于多少纳米 计算0.125的2010次方×16的2011次方/4的1006次方×5 初二数学上册因式分解(x-3)²-9+3x 23纳米等于几米?用科学计数法 (-0.25)的1998次方*(-4)的1999次方= 分解因式 十字相乘法!火急!(1)x³-5x²+x (2)2x²-3x-2 a%b=(a+b)除以(a-b) (8%4)&2=?a&b=(a+b)除以(a-b) (8&4)&2=? (-0.25)的100次方乘4的99次方 怎么算X:(4/3X-4.2)=8:5 b除以a=8,那么a除以b=? 计算:(-0.25)的100次方×(-4)的99次方是多少 求一元二次方程:3X(平方)-5X-8=0的解题过程.注:一定要用公式法谢谢各位啦. a除以b=8,a比b=( )比( ) 1/2+1/4+1/8+1/16+…+2的2010次方 分之一 得值等于多少? 若x-y=-2,则3-3x+3y= 【】除以5=【】/8=【】/12=【】=5/2=【】是假期册子上的 负1的2014次方是几要列式 急![(3x+y)²-3(3x-y)(x+y)-(x-3y)(x+3y)]÷(2xy)[(3x+y)²-3(3x-y)(x+y)-(x-3y)(x+3y)]÷(2xy)其中x=½,y=-2 1.如果a除以b的商是0.8,那么a与b的比是().2.若5:x=3:y,那么x与y成()比例.3. 2.55时=()时()分 若(9m的次方加一)的2次方=3的16次方,求正整数m的值 〖(y-3x)(-3x-y)-9(x-2y)∧2〗÷3y,其中x=-2,y=3 a除以b的商是1.8,a与b的比是 【 】 3×9m次方×27m次方=3的11次方 求m正确答案是2 但我算的是5 为什么 (x+y)/2+(x-y)/3=6 2(x+y)-3x+3y=24 过程 计算(1.5×10三次方)×(8×10平方) m^4-9m^2+16=0的解 javascript中 -13>>2 等于多少,为什么?13|5 又等于多少,为什么? 3的1次方+1=4,3的2次方+1=10,3的3次方+1=28,3的4次方+1=82……依此规律,计算3的2011次方+1的个位数字 16/9m^2-4/25n^2 240X780厘米等于多少平米,为什么?240X780厘米280X400厘米等于多少平米,为什么? 两个数之和的三次方怎么算 -3的三分之一次方除以(6的三分之4次方)的2分之三次方用幂的形式表示 80克等于多少斤? a的三次方分之一除以a的六次方分之一等于多少? 3个10,1个4.怎么等于24? 1纳米等于多少米 10的负7次方除以1,60x10的负19次方等于多少 3,8,6,9怎样等于24? 1飞米等于多少纳米?1飞米等于10-15米,纳米. 若2的a次方等于2,4的b次方等于6,8的c次方等于12,试确定abc的关系, 8 8 3 6每个数用一次,让它们的结果等于24 1纳米等于多少米 怎么得的 5的12次方等于什么的6次方 3个8和一个6怎么等于24
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn