C++ 是否有相当于印地9';Indy 10中的ReadBuffer()是什么?

C++ 是否有相当于印地9';Indy 10中的ReadBuffer()是什么?,c++,indy10,rad-studio,C++,Indy10,Rad Studio,此代码是使用Indy 9在Borland C++Builder 6中编写的: void\uu fastcall TfrmMain::ServerConnect(TIdPeerThread*AThread) { BKUK_数据包; ----------(中略)--------------------------------------- AThread->Connection->ReadBuffer((字节*)&Pkt,sizeof(BKUK_数据包)); ----------(中略)------

此代码是使用Indy 9在Borland C++Builder 6中编写的:

void\uu fastcall TfrmMain::ServerConnect(TIdPeerThread*AThread)
{
BKUK_数据包;
----------(中略)---------------------------------------
AThread->Connection->ReadBuffer((字节*)&Pkt,sizeof(BKUK_数据包));
----------(中略)---------------------------------------
}
在Indy 10中找不到名为
ReadBuffer()
的函数。是否有等效函数

BKUK_数据包
是一个大约1200字节的结构

typedef struct\u BKUK\u数据包_
{
字节头[4];
字载荷;
字长;
字节数据[1200];
单词Ver;
字节尾[2];
}BKUK_包;
当我查看Indy 10的使用手册时,我发现了
ReadBytes()
。但是当我尝试按以下方式编程时,我得到了一个错误:

Context->Connection->IOHandler->ReadBytes((字节*)&Pkt,sizeof(BKUK_数据包))
[bcc32c错误]Main.cpp(530):对类型“Idglobal::TIdBytes”(又名“DynamicArray”)的非常量左值引用无法绑定到类型为“BYTE*”的临时变量(又名“unsigned char*”)

hpp(235):在此处将参数传递给参数“VBuffer”


请告诉我如何修复此代码。

ReadBytes()的签名是

virtual void __fastcall ReadBytes(Idglobal::TIdBytes &VBuffer, 
                                  int AByteCount,
                                  bool AAppend = true);
TIdBytes
如果要在不使用中间变量的情况下填充
Pkt
,则动态特性使得
ReadBytes()
不是一个好的选择

但是,您可以使用
TIdIOHandler

System::Byte __fastcall ReadByte();
并创建自己的函数来填充对象:

template<typename T>
void __fastcall Populate(T& obj, TIdIOHandler* ioh) {
    System::Byte* p = (System::Byte*) &obj;
    for(unsigned count=0; count<sizeof(T); ++count, ++p)
        *p = ioh->ReadByte();
}

TIdIOHandler::ReadBytes()
方法将很好地工作,您只需首先使用中间变量
TIdBytes
读取,然后您就可以将该数据复制到
BKUK_数据包
变量中,例如使用Indy的
BytesToRaw()
函数,例如:

void\uu fastcall TfrmMain::ServerConnect(TIdContext*AContext)
{
BKUK_数据包;
TIdBytes字节;
AContext->Connection->IOHandler->ReadBytes(字节,大小为BKUK_数据包));
BytesToRaw(字节和Pkt,sizeof(BKUK_数据包));
//根据需要使用Pkt。。。
}
或者,您可以使用
TIdIOHandler::ReadStream()
方法和
TIdMemoryBufferStream
直接读入
BKUK_数据包
变量,类似于Indy 9的
ReadBuffer()
,例如:

#包括
void\uu fastcall TfrmMain::ServerConnect(TIdContext*AContext)
{
BKUK_数据包;
std::unique_ptr strm(新的TIdMemoryBufferStream(&Pkt,sizeof(BKUK_数据包));
//或C++11之前的std::auto_ptr。。。
AContext->Connection->IOHandler->ReadStream(strm.get(),sizeof(BKUK_数据包),false);
//根据需要使用Pkt。。。
}
BKUK_PACKET Pkt;
Populate(Pkt, Context->Connection->IOHandler);