一个关于流转换的问题!!用于UDP发送!

baozhi 2005-05-22 06:38:08
情况如下:
现有一结构:
struct FileStreamInfo{
long Size;
AnsiString FileName;
TMemoryStream *FileStream;
};
现在我要把这个结构转换成为一个unsigned char*指针就像流一样!!
把前面两个成员Size和FileName转换成为unsigned char*很简单!!
AnsiString Sizetmp = IntToStr(Size);
unsigned char* chSize= new char[Sizetmp.Length() + 1];
unSigned char* tmpSize = chSize;
strcpy(chSize,Sizetmp.c_str(),Size.Length());
Sizetmp += Size.Length();
Sizetmp = '\0';
FileName也是使用类似办法
当UDP接到因为后面都使用了'\0'就很容易把结构里的Size和FileName读出来并还原成结构.
我现在的问题是如何把FileStream也转换成为一个unsigned char*并和前面两个成员SizeFileName加到一起成为一个完整的流!并在UDP收到后可以还原成为上面的哪个结构!!急!!
我想要的流是这样的:unsigned char* = FileStreamInfo.Size + FileStreamInfo.FileName + FileStreamInfo.FileStream,我把这个unsigned char*流通过使用udp传送给别一台电脑,另一台电脑又要把这个unsigned char*还原成为上面的结构
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2005-05-23
  • 打赏
  • 举报
回复
至于象这种结构体的数据传送,个人建议是分成员写入流当中

struct FileStreamInfo{
long Size;
AnsiString FileName;
TMemoryStream *FileStream;
};
那么如果是一个对象,那么就直接写
--------------------------------------------------------------------------------------
| sizeof(Size) | Size | FileName.Length() | FileName | FileStream->Size | FileStream |
--------------------------------------------------------------------------------------
僵哥 2005-05-23
  • 打赏
  • 举报
回复
在定义结构体时,成员最好不要使用String、AnsiString、WideString等非标准类型对象,要使用则使用指针,否则会引来不必要的麻烦,例:
struct tagA{
AnsiString Name;
AnsiString Addr;
int Number;
struct tagA *Next;
}A;
这个结构体的类型定义应该都不会有什么异议
接着是使用
A *p;
p=(struct A *)malloc(sizeof(struct A));
p->Name="A";
p->Addr="Addr";//运行到此行就会出错。
若需要如此使用,则最好是改成如下形式
struct tagA{
AnsiString *Name;
AnsiString *Addr;
int Number;
struct tagA *Next;
}A;
铖邑 2005-05-22
  • 打赏
  • 举报
回复
发送:
FileStreamInfo fsi;
int i = sizeof(FileStreamInfo) - sizeof(TMemoryStream *);
int j = fsi.FileStream->Size;
char *buf = new char[i + j];
memcpy(buf, &fsi, i);
fsi.FileStream->Read(buf + i, j);

接收:
接收缓冲区buf,接收字节n
FileStreamInfo fsi;
int i = sizeof(FileStreamInfo) - sizeof(TMemoryStream *);
memcpy(&fsi, buf, i);
fsi.FileStream = new TMemoryStream();
fsi.FileStream->Write(buf + i, n - i);
whzeng 2005-05-22
  • 打赏
  • 举报
回复
怎么非要强制转换成unsigned char * 呢?通讯规约是人定的,为什么要受限制呢!
whzeng 2005-05-22
  • 打赏
  • 举报
回复
帮你顶一下!
不过忍不住问一下,从文件流读到缓冲区,将冲缓冲区字符转化为unsigned char* 不行吗?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧