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

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

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










一个关于乘法溢出问题的探讨 -VB资料 一组VB实用小程序 一组VB应用技巧 隐藏和显示任务栏-VB资料 应用 WSH 读写注册表和建立快捷方式 -VB资料 VB用 IIF 和 SWITCH 以精减代码 VB用BASIC语言设计Windows风格的用户接口 VB用Form 的 Mouse_Move事件来检查鼠标是否在窗口内: VB用RND()函数加密 VB用SendKeys来捉屏 用VB4.0制作软件封面 用VB5 对Windows 95 任务栏提示区进行编程 用VB5读写注册表实例 用VB5开发商品软件的经验谈 用VB5设计多功能计时器 用VB5制作文字上卷效果 用VB6.0实现打字效果 用VB编写DirectX7.0游戏(上) 用VB创建Excel报表 用VB读取和控制Windows的中文输入法 用VB将命令行软件Windows化 用VB进行移位操作 用VB开发CAI软件的小经验 用VB开发分布式应用 用VB切换三个特殊键 用VB生成EXE文件后,如何在后面加上参数?这个参数怎样传给VB 用VB实现动态显示操作进度程序 用VB实现双向循环链表 用VB实现用户登录密码的修改 用VB与MS-Draw开发通用作图软件 用VB制作TopMost类型窗口 Visual J++ 6.0的问题! 关于Word,IE等程序的设计模型问题? 在线等待BCB+Access 怎样实现如vc集成开发环境的控件窗口 关于asp.net控件使用中的一些问题 请问,怎样做出桌面动画(比如鸟在桌面上飞等等....) 文本处理里面可以包含图片么? 如何判断用户输入的是中文还是英文,数字,或者是非法的字幅。 简单问题,50分奉献! 一个关于序列的问题,各位帮帮忙!! 是不是程序中的配置文件.config只能在运行期间读取,而不能更新数据?如果能更新那怎样更新,我没有找到更新所用的类。 世界上最大的塔里班........ ???? 我还是不明白,这是为什么 ???????? 关于寻址 如何得到想要的Excel表中的正确行数,救命!!! 兴奋~收到borland公司的邀请涵,散分! 关于DTS transmit data !!请帮帮忙,谢谢 tc,dos下如何调用1cH中断,写定时程序,在线等待!急 有没有办法在一个ASPX页面里设置两个<form runat=server>? 100 求 Visual J++ 6.0 的下载地址(一定要能下载喔 :) 关于OLE控件中的移动问题? 连接Access数据库报错,如何解决?在线等候! 谁有evc开发的ssce数据库的源码 菜鸟提问:File|New|Other...下NewItems Dialog... 2002年2月25日Borland公司在国内推出Delphi认证考试 出个小问题来给大家看看,不要笑我呀 如何将*.cmp的文件存到ms sql server数据库? 我的窗口怎么处理不了方向键消息? 列举sql的触女器可以触发什么动作,能否回滚引起触发的事务 几个unix下的c菜问题请教 !!!!!!!!!!!!!!!!!!!!!!对socket技术开发有经验者,请帮助!!!!!!!!!!!!!! 为什么有时_variant_t变量不能转换为_bstr_t,而有时就可以?里面有什么奥妙? 高分求助!请问怎么去掉IE的最大化和最小化按钮!! 关于UltraDev中浏览的问题???? 请大家推荐几本vc与汇编混和编程的好书 为什么会这样呢?关不掉的对话框 菜鸟提问:Form 与 Frame 有何区别? 以下是Delphi帮助的说明,谁能帮忙解释一下? 流星花园 我在image的click()方法里定义的变量,为什么在image_dblclick()里不能用?? 请教一下:金山词霸的屏幕取单词,是如何用程序实现的? 用VC怎么实现生成一个虚拟目录? 那位朋友有2000命令行模式下命令操作的帮助手册? IIS虚拟主机的问题,请大家给解决呀! 一个有关ListCtrl中拖动Column的问题。 请问那位大虾有用vc开发openssl的经验和原码? 兄弟我想学习数据库 但学什么好呐 给点意见 急求:将savedialog中多选的文件一次全都添进listview 谁有DirectX开发(SDK),给我一份,或留个连接地址 谁有DirectX开发(SDK),给我一份,或留个连接地址 怎样动态生成函数??? 你好!请问怎样给分? 四、判断题.(正确的画“√”,错误的画“╳”)(10分)2.东晋王羲之被后人称为“草圣”. ( )3.“书是全世界的营养品”这句话是高尔基说的. ( )4.中国古代有 分子是5的假分数有()个,其中()能化成带分数. 珍惜身边爱你的人 心里闷闷的 不知道从何时开始我也体会到了 除了思念亲人还可以思念一个已经和我毫无关系的人了 每天睁开眼睛是 闭上眼睛是 梦中哭醒 醒后还是接着哭那个被我伤害过 求高二物理静电场的练习题 冒号的作用都有哪些? 牛顿对数学贡献大还是对物理贡献大? 判断题(对的面“√”,错的画“×”a是一个整数,a的到数一定是a分之1.( ) 冒号的作用有哪些关于字典公公吵架的【冒号】 “珍惜眼前的幸福”或“现在的我很幸福”英文怎么说?如题~ 一物体以初速度v竖直上抛,落回原地的速度v/2,设物体运动过程中所受阻力大小不变,则重力与阻力之比为? 冒号的作用是? 珍惜眼前幸福英语怎么写 受到有阻力大于人和伞的总重力,为什么做减速运动? 一物体以初速度V0竖直上抛,重力加速度为g,运动中受到的阻力f=kv^2. 求其上升的最大高度,以及所用时间物体质量m 冒号的作用是什么? 为什么牛顿那么聪明? 以初速度v0竖直上抛一个质量为m的物体,设物体在运动过程中所受到的阻力的大小不变,物体经过时间t到达最高如题以初速度v0竖直上抛一个质量为m的物体,设物体在运动过程中所受到的阻力的 图形判断题答案是什么 牛顿聪明还是爱迪生聪明我知道没人可以回答我 (比较基础的静电场题目)1.在一个以点电荷Q为中心,R为半径的球面上,各处的电场强度都相同.(为什么这个说法是错误的?)2.一个初动能为Ek的带电粒子,以速度V垂直电力线方向飞入平行版 判断题,图形 是孔子聪明还是牛顿聪明 如图所示,在水平放置的已经充电的平行板电容器之间,有一带负电的油滴处于静止状态.若某时刻油滴的电荷量开始减小(质量不变),为维持该油滴原来的静止状态应 A.给平行板电容器充电 求图上的判断题答案. 牛顿聪明么 判断题(对的画“√”,错的画“×”并订正或说明理由)1、一个圆的半径是2分米,它的周长和面积相等()2、0.365扩大100倍是36.5()3、π=3.14()4、圆锥体体积是圆柱体体积的1/3()5、大 一道关于相似图形判断题下列各组图形中不一定相似的图形有几个?1.两个矩形2.两个正方形3.两个等腰三角形4.两个等边三角形5.两个直角三角形6.四个角对应相等的两个等腰梯形7.有一个角为4 有关高二物理静电场 方面的习题? 假分数都大于一还是带分数都大于一 把带分数化成假分数,用原来的分母作( ),用分母与整数的( )再加上原来的分子作( ).各位帮帮忙,急用! 丢可以组什么词 高二物理 静电场的题目一道 谢谢啦如图所示,直线OO′为某电场中的一条电场线,电场方向由O指向O′.一带电粒子沿该电场线运动,途经距离为S的A、B两点过程中,所用的时间为t,经A、B中间位置 一道数学判断题怎么算?3.45×0.48的积里面有四位小数.( ) 丢组词有哪些 数学的判断题,如果是错的就说理由,1.把六个正方形围起来,就得一个正方体.2.任何一个长方体,相邻的面不可能完全相同.3.把一个圆柱的侧面展开,得到一个正方形,那么圆柱的高和底面直径就 $dbname = isset($_POST['dbname']) trim($_POST['dbname']) :'';php语法中的问号与冒号的疑问,上面句子中问号和冒号的解释是什么?在上面情况下可以用问号和冒号,他们有其他方式代替吗? 至的组词掉 空间存在甲、乙两相邻的金属球,甲球带正电,乙球原来不带电,由于静电感应,两球在空间形成了如图所示稳定的静电场.实线为其电场线,虚线为其等势线,A、B两点与两球球心连线位于同一直线 我最珍惜的人,用英语怎么说 丢组什么词 在正方形四个顶点上分别放上四个点电荷,依次是Q,-q,Q,-q ,若四个点电荷均能保持静止状态,则Q:q等于?答案是√2/2.正方形对顶的字母一样 牛顿在物理学方面的贡献是什么?100字左右 丢怎么组词 牛顿的故事有哪些 带有蛇的成语不要普通的 一物体以7m/s的加速度竖直下落时,物体受到的空气阻力大小是物体重力的几倍? 若地球上的物体所受的重力突然消失了.请你设想三个情景 急求.你一直是我想要珍惜的人 用英语怎么说、 数学表达式中“:一个冒号后面加一个等号如图就是这个公式 地球上所受物体重力突然消失,会出现什么情况 牛顿的故事有哪些要关于地心引力,不要太长 数学公式符号 冒号冒号的作用有哪些作用? 若地球上的物体所受的重力突然消失,将会出现什么情景 带牛的成语 请问,公式如下图所示. 若地球的物质所受的重力突然消失,将会出现什么情景 牛顿的贡献可以获得诺贝尔奖物理学奖吗也就是说他有资格获得诺贝尔物理学奖吗不要说不授予死人,单论贡献 数学中的比号和语文中的冒号有什么不同 我只是想找一个珍惜我的人 翻译英语用到i just want to find someone. 在天文学领域谁的贡献像牛顿对物理学的贡献?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘