感谢您的帮助。
我正在将旧版本的Delphi转换为XE5,我对Indy组件感到困惑。需要使用IdUDPClient.ReceiveBuffer
这是我的代码:
while not Terminated do
begin
try
lenUDP:= IdUDPClient.ReceiveBuffer(myBuf, buffLength, -1 );
if lenUDP<> 0 then
Synchronize(ReceivedLine);
except
Terminate;
end;
end;
其中, myBuf = char的数组[0 .. buffLength -1];
非常感谢所有帮助。
谢谢,
麦克
答案 0 :(得分:5)
正如我在评论中告诉你的previous question:
你也必须使用
TIdBytes
。使用SetLength()
将其预先分配到所需的大小,然后使用它调用ReceiveBuffer()
,然后您可以根据需要直接或使用BytesToRaw()
复制数据。
例如:
private
myBuf: TIdBytes;
...
while not Terminated do
begin
try
SetLength(myBuf, buffLength);
lenUDP := IdUDPClient.ReceiveBuffer(myBuf, -1);
if lenUDP > 0 then
begin
SetLength(myBuf, lenUDP);
Synchronize(ReceivedLine);
end;
except
Terminate;
end;
end;
由于您的原始缓冲区是Char
的数组,并且您的处理函数名为ReceivedLine()
,因此我假设您的数据本质上是文本的。如果是这样,您可以使用BytesToString()
或(T|I)IdTextEncoding.GetString()
将TIdBytes
转换为String
,如果这是ReceivedLine()
使用的myBuf
{}例如:
S := BytesToString(myBuf{, en8bit});
S := BytesToString(myBuf, 0, lenUDP{, en8bit});
S := IndyTextEncoding_8bit.GetString(myBuf);
S := IndyTextEncoding_8bit.GetString(myBuf, 0, lenUDP);
您可以使用Indy支持的任何字符集编码,通过en...()
单元中的各种Indy...Encoding()
,IndyTextEncoding...()
或IdGlobal
函数,或{{1 {}}}单位中的函数。
UPDATE :由于您的缓冲区是包含联合的记录的一部分,因此您必须使用本地CharsetToEncoding()
变量:
IdGlobalProtocols