function TMainForm.SendStreamToServer(AThread:TIdPeerThread;Cmd:String): Boolean;
var
MyStream: TMemoryStream;
i:integer;
begin
try
MyStream:=TMemoryStream.Create;
MyStream.Write(Cmd[1],Length(Cmd));
MyStream.Position:=0;
i:=MyStream.size;
AThread.Connection.WriteLn(inttostr(i));
AThread.Connection.WriteStream(MyStream);
Result := True;
except
AThread.Connection.Disconnect;
AThread.Terminate;
MyStream.Free;
Result := False;
end;
MyStream.Free;
end;此函数是灰鸽子1.2vip 里的一个发送流给idtcpclient里的一个函数
我想问下 MyStream.Write(Cmd[1],Length(Cmd));
这个东东。 为什么要用cmd[1]
他是把cmd里的东东。全写到流中。为什么cmd[0]不要呢?
我记得string里若是有字符的话。好像是从0开始的
就是说cmd[0]表示第一个字符。是否这样?那位对流比较熟的解释下?
var
MyStream: TMemoryStream;
i:integer;
begin
try
MyStream:=TMemoryStream.Create;
MyStream.Write(Cmd[1],Length(Cmd));
MyStream.Position:=0;
i:=MyStream.size;
AThread.Connection.WriteLn(inttostr(i));
AThread.Connection.WriteStream(MyStream);
Result := True;
except
AThread.Connection.Disconnect;
AThread.Terminate;
MyStream.Free;
Result := False;
end;
MyStream.Free;
end;此函数是灰鸽子1.2vip 里的一个发送流给idtcpclient里的一个函数
我想问下 MyStream.Write(Cmd[1],Length(Cmd));
这个东东。 为什么要用cmd[1]
他是把cmd里的东东。全写到流中。为什么cmd[0]不要呢?
我记得string里若是有字符的话。好像是从0开始的
就是说cmd[0]表示第一个字符。是否这样?那位对流比较熟的解释下?
解决方案 »
- 一秒关机,有须要的朋友进来看看,希望高手能把此代码译成Delphi,100分感谢!
- 欢迎Delphi学习者和爱好者加入"Delphi先锋2号群",群号:704827,大家一起学习交流,UP者有分!
- 指向integer的指针怎样定义和new创建,怎样释放
- 用quickrep 导出的EXCEL文件 问题
- 用dbexpress连SQL Server2000库,分发软件时客户端程序如何设置。
- 用TidSMTP发邮件,给Send的参数是一个TidMessage对象,我在调用Send时提示如下错误:"You are not authorized to send mail as <> "
- 这个代码还是不行啊,真的好急啊,大家帮帮忙吧。
- 关于ADO的一个简单问题!
- 一个关于数据库连接的问题,急!
- 怎样才可以把数据库中,储存JPG图片的字段的信息提取出来后,再转换成一个文件?
- 求个说明书
- 关于子窗体不能打开的问题
不管长短,[1]都是内容的第一个字符
var
s:string;
i:integer;
begin
s:='adfssssssss';
for i:=0 to length(s) do
begin
showmessage(s[i]);
end;这里是否表示s[0]是一个char
那么他的长度呢?放在那里
string是长字符串,机制与短字符串不同,长度最大可达2G,需要4个字节来存储长度
照ccrun的说法那么。string[0]并不是表示字符串的长度。是不是这样理解呢?
他是向前偏移四个字节来保存的。所以并不是用string[0];
var
s:string[10];
begin
s := '12345';
ShowMessage(IntToStr(Ord(s[0])));
end;
var
s:string[10];//这个是定义为短字符类型。。
//Cmd:String 照理说与string这个默认是长字符串类型。是否不通用?还是通用?
看下面的说明。应与string与string[x]存储不同。所以楼上的例子是对的。但是上面的是定义为string类型string分两种,
一种是与Pascal传统string相兼容,叫ShortString,
它的存储结构如下:
+---------------------+
| 1Byte | 字符串内容 |
+---------------------+
0 1 ......
其中第一个字节为字符串的长度。
所以ShortString所能包括的字符串长度不能大于255。
另一种是叫长字符串AnsiString, 它就是一个指向字符串的指针,不过具体的存储有些特别。
它的存储结构如下:
+-----------------------+
| 4B | 4B | 字符串内容 |
+-----------------------+
-8 -4 0 ......
其中,AnsiString指向字符串第一个字符,
。我之前肯定试过。
var
s:string;
i:integer;
begin
s:='adfssssssss';
for i:=0 to length(s)-1 do
begin
showmessage(s[i]);
end;
这样肯定可以访问啊。/
s[0] .....不过上面的介绍说是的第一个字节为字符串的长度。这个第一个字节里。 是否用s[0]这样表示,照理说不是这样表示的。这样表示的应是说的是这个字符串里的第一个字符,并不是说的存这个字符的长度的。第一个字节应是 pointer(s) 转为地址之后数值。
若转为之后是
100000
那么就是这里之间存的是长度。。
100001
用什么表示么?
for i:=1 to length(s) do
begin
showmessage(s[i]);
end;
这样才能把所有的字符显示出来。
另外,AnsiString的长度是没有限定的,如果说s[0]是长度的话也不对,因为s[0]也只有一个Byte,如果长度大于256那么就不行了,所以s[0]应该是针对ShortString的。
谢谢了。。