procedure TChatInfo.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
FReceiveStream.Clear;
FReceiveStream.LoadFromStream(AData);
FReceiveStream.Read(MessageID, SizeOf(MessageID));
在indy10中这个TMemoryStream该怎么转换呢?
在indy10中不是AData: TStream;是AData: TBytes;了 该怎么转换过来呢?
用BytesToRaw RawToBytes吗?
比如 FSendStream.Write(MessageID, SizeOf(MessageID));
UDPClient.SendBuffer(ABinding.PeerIP, UDPClientServerPort, FSendStream.Memory^, FSendStream.Size);
是否该 FSendStream.Write(MessageID, SizeOf(MessageID));
UDPClient.SendBuffer(ABinding.PeerIP, UDPClientServerPort, RawToBytes(FSendStream.Memory^, FSendStream.Size));行吗?
是不是把TBytes写到TMemoryStream里面再用,是该怎么个写法呢?
求高人指点指点啊,谢谢谢谢啊~~
10 个解决方案
#1
看到僵哥大大的解说 不是太明白 该怎么用 那位好心人能举个例
Indy10有好几个版本。
Stream转Bytes
//第一个参数,就是那个TMemoryStream,第二个参数是一个TIdBytes类型,第三个是你需要取多少字节,返回值是实际取得的字节数
function ReadTIdBytesFromStream(const AStream: TStream; var ABytes: TIdBytes; const Count: Integer): Integer;
var
mem: TMemoryStream;
bytes: TIdBytes;
...
mem.Position := 0;
ReadTIdBytesFromStream(mem,Bytes,mem.Size);
反过来可以使用
procedure WriteTIdBytesToStream(const AStream: TStream; const ABytes: TIdBytes;
const ASize: Integer = -1; const AIndex: Integer = 0);
Indy10有好几个版本。
Stream转Bytes
//第一个参数,就是那个TMemoryStream,第二个参数是一个TIdBytes类型,第三个是你需要取多少字节,返回值是实际取得的字节数
function ReadTIdBytesFromStream(const AStream: TStream; var ABytes: TIdBytes; const Count: Integer): Integer;
var
mem: TMemoryStream;
bytes: TIdBytes;
...
mem.Position := 0;
ReadTIdBytesFromStream(mem,Bytes,mem.Size);
反过来可以使用
procedure WriteTIdBytesToStream(const AStream: TStream; const ABytes: TIdBytes;
const ASize: Integer = -1; const AIndex: Integer = 0);
#2
不太清楚
TMemoryStream是从TStream继承来的。
TMemoryStream是从TStream继承来的。
#3
偶也是不太清楚啊
#4
ToBytes(StrEAM.Memory,StrEAM.Size);
#5
楼上的兄弟 你只说了一个地方
#6
看来没有人说了啊 还有人知道吗
#7
indy也是,9到10,也不会保留、兼容9的方法。。。。。。
虽然保留旧方法可能会导致类庞杂,但是只要分类清晰,可以让开发者慢慢自动放弃旧方法的
现在却是原代码无法直接升级。。。。。。
虽然保留旧方法可能会导致类庞杂,但是只要分类清晰,可以让开发者慢慢自动放弃旧方法的
现在却是原代码无法直接升级。。。。。。
#8
#9
不太清楚,很少用 INDY,
你可以试一试 RawToBytes ,相对应的 BytesToRaw,
uses Idglobal;
var
Buf: TidBytes;
你可以试一试 RawToBytes ,相对应的 BytesToRaw,
uses Idglobal;
var
Buf: TidBytes;
#10
你要改写 你的函数 。
不要考虑 把stream改写成 Tidbytes。
而考虑把源数据结构改写成Tidbytes.
比如原先是 string to stream
现在是string to tidbytes.
Indy里边,关于tidbytes的转换函数有很多!
不要考虑 把stream改写成 Tidbytes。
而考虑把源数据结构改写成Tidbytes.
比如原先是 string to stream
现在是string to tidbytes.
Indy里边,关于tidbytes的转换函数有很多!
#1
看到僵哥大大的解说 不是太明白 该怎么用 那位好心人能举个例
Indy10有好几个版本。
Stream转Bytes
//第一个参数,就是那个TMemoryStream,第二个参数是一个TIdBytes类型,第三个是你需要取多少字节,返回值是实际取得的字节数
function ReadTIdBytesFromStream(const AStream: TStream; var ABytes: TIdBytes; const Count: Integer): Integer;
var
mem: TMemoryStream;
bytes: TIdBytes;
...
mem.Position := 0;
ReadTIdBytesFromStream(mem,Bytes,mem.Size);
反过来可以使用
procedure WriteTIdBytesToStream(const AStream: TStream; const ABytes: TIdBytes;
const ASize: Integer = -1; const AIndex: Integer = 0);
Indy10有好几个版本。
Stream转Bytes
//第一个参数,就是那个TMemoryStream,第二个参数是一个TIdBytes类型,第三个是你需要取多少字节,返回值是实际取得的字节数
function ReadTIdBytesFromStream(const AStream: TStream; var ABytes: TIdBytes; const Count: Integer): Integer;
var
mem: TMemoryStream;
bytes: TIdBytes;
...
mem.Position := 0;
ReadTIdBytesFromStream(mem,Bytes,mem.Size);
反过来可以使用
procedure WriteTIdBytesToStream(const AStream: TStream; const ABytes: TIdBytes;
const ASize: Integer = -1; const AIndex: Integer = 0);
#2
不太清楚
TMemoryStream是从TStream继承来的。
TMemoryStream是从TStream继承来的。
#3
偶也是不太清楚啊
#4
ToBytes(StrEAM.Memory,StrEAM.Size);
#5
楼上的兄弟 你只说了一个地方
#6
看来没有人说了啊 还有人知道吗
#7
indy也是,9到10,也不会保留、兼容9的方法。。。。。。
虽然保留旧方法可能会导致类庞杂,但是只要分类清晰,可以让开发者慢慢自动放弃旧方法的
现在却是原代码无法直接升级。。。。。。
虽然保留旧方法可能会导致类庞杂,但是只要分类清晰,可以让开发者慢慢自动放弃旧方法的
现在却是原代码无法直接升级。。。。。。
#8
#9
不太清楚,很少用 INDY,
你可以试一试 RawToBytes ,相对应的 BytesToRaw,
uses Idglobal;
var
Buf: TidBytes;
你可以试一试 RawToBytes ,相对应的 BytesToRaw,
uses Idglobal;
var
Buf: TidBytes;
#10
你要改写 你的函数 。
不要考虑 把stream改写成 Tidbytes。
而考虑把源数据结构改写成Tidbytes.
比如原先是 string to stream
现在是string to tidbytes.
Indy里边,关于tidbytes的转换函数有很多!
不要考虑 把stream改写成 Tidbytes。
而考虑把源数据结构改写成Tidbytes.
比如原先是 string to stream
现在是string to tidbytes.
Indy里边,关于tidbytes的转换函数有很多!