1.ole的流:
先将 string转换成流TStringStream(BBS的朋友)
procedure StreamToVariant(var Data: OleVariant; Stream: TStringStream);
var
p: Pointer;
begin
Data := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Data);
try
Stream.Position := 0;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Data);
end;
end;
--------------------------------
2.文件流->字符流(李维)
function BlobContentToString (const FileName: string): string;
begin
with TFileStream.create(FileName, fmOpenRead) d o
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
finally
Free;
end;
end;
-------------------------------------
3.内存流->文件流.
var
t:Tmemorystream;str:string;
begin
t:=TMemoryStream.create;
str:='大富翁';
t.write(Pointer(str)^,length(str)); //这样应该也可以的
...
end;
--------------------------------
4.流的比较
function CompareStream(StreamA,StreamB:TMemoryStream):Integer;
var
B1,B2:Byte;
begin
StreamA.Position:=0;
StreamB.Position:=0;
while StreamA.Position<StreamA.Size do
begin
StreamA.Read(B1,1);
StreamB.Read(B2,1);
if B1 <> B2 then
Break;
end;
Result:=StreamA.Position;
end;
5.----------------------------
流的区别,指针,区别(来源(小笨笨)
理解指针,主要有两个方面,一个是指针变量本身所占内存的大小,另一个是指针所指向
的数据的数据类型的大小(或长度)。
从前者来看,各种类型的指针都是一样的,都没什么区别,因为在Win32系统下,指针变量
都占4个字节,你可以自己试试,IntToStr(sizeof(Pointer));但从后者来看,就有点不一
样了,这主要就表现在指针移动的步长可能是不一样的,就是说,你让指针移动一个单位,
实际内存中指针移动的字节数是不一样的。请看下面的例子:
var
ms: TMemoryStream;
pInt: ^Integer;
// pInt: PChar;
i: Integer;
j: Integer;
begin
ms := TMemoryStream.Create; //声明并建立一个内存流对象
i := 123;
ms.Write(i, sizeof(Integer)); //向流中写入一个整型值123
i := 99;
ms.Write(i, sizeof(Integer)); //向流中再写入一个整型值99
pInt := ms.Memory; //将这块内存的首地址,也就是指向123的那个地址
//赋给基类型是整型的指针变量pInt
Inc(pInt); //将指针移动一个单位,由于基类型是整型,整型是占4个字节的
//所以,这里虽然只是移动了一个单位,但却相当于移动了4个字节的长度,
//也就是这时指针指向了99这个整数的位置
Move(pInt^, j, sizeof(Integer)); //将99取出来
Caption := IntToStr(j); //显示一下,果然是99
ms.Free;
{
如果将上面的pInt: ^Integer;改成pInt: PChar;其他地方不动,你会发现读出来的数
据不是99,而是内存中的一个随机值,但如果你再将Inc(pInt);改成Inc(pInt, 4);
就正确了。原因就是PChar的基类型是Char,而它是占1个字节的,所以,你移动一个
单位,只移动了一个字节,当然得不到正确的答案了。
}
end;
!!!!这就是各种指针的本质区别!!!!
至于Pointer是无类型的指针,也就是它可以指向任何类型的数据,你将它强制转换成整型,
它就是^Integer,你将它强制转换成字符型,那它就是PChar.....我再将上面的代码改成
Pointer,你就明白了
type
TPInt = ^Integer;
var
ms: TMemoryStream;
pInt: Pointer; //这里
i: Integer;
j: Integer;
begin
ms := TMemoryStream.Create;
i := 123;
ms.Write(i, sizeof(Integer));
i := 99;
ms.Write(i, sizeof(Integer));
pInt := ms.Memory;
Inc(TPInt(pInt)); //这里,其实,使用预定义的整型指针也行,我就是为了说清楚一点
//Inc(PInteger(pInt));
Move(pInt^, j, sizeof(Integer));
Caption := IntToStr(j);
ms.Free;
end;