如何使用:byte [0..x]的字节?

时间:2011-04-04 18:07:03

标签: delphi

我有这段代码。 BufferAddress最初是PByteArray类型。 但是,PByteArray仅限于32768个元素,但我需要的不仅仅是。

我在运行时不需要什么是最大限制,所以我将TLargeArrayOfBytes定义为0到2GB。有一个更好的方法吗?

function TBufferedStream.Read(VAR aBuffer; Count: Integer): Longint;
TYPE
   TLargeArrayOfBytes = array[0..2000000000] of Byte;
   PArrayOfBytes = ^TLargeArrayOfBytes;
VAR
   BufferAddress: PArrayOfBytes;       // it was PByteArray
begin
 ...

 { Then refill buffer... }
 FillReadBuffer;

 { ...and continue reading }
 BufferAddress:= @TLargeArrayOfBytes(aBuffer);
 Result:= Result+ ReadFromBuffer(BufferAddress[Result], Count- Result);  { Read from RAM buffer }
end;

Delphi 7

3 个答案:

答案 0 :(得分:4)

我的定义中没有看到任何错误,唯一的建议是你可以使用MaxInt const。

type
   TLargeArrayOfBytes = array[0..MaxInt-1] of Byte;

或者SysUtils.TBytes类型

答案 1 :(得分:3)

PByteArray 确实仅限于那么多字节。它可以指向任何大小的数组。如果在将括号运算符应用于数组指针时启用了范围检查,则唯一的问题就出现了。然后编译器检查索引是否在声明的类型的范围内,而不管指针实际指向的字节数。在这样的表达式之前禁用范围检查,然后再将其重新打开。

BufferAddress:= PByteArray(@aBuffer);
{$R-}
// Read from RAM buffer
Result := Result + ReadFromBuffer(BufferAddress[Result], Count - Result);
{$R+}

答案 2 :(得分:0)

使用POINTERMATH指令,您不需要声明指向数组的指针类型。

{$POINTERMATH ON}

procedure TForm1.FormCreate(Sender: TObject);
var
  P : PByte;
begin
  GetMem(P,1000);

  P^ := 42;      //Access first/current element
  P[999] := 42;  //Access last element

  FreeMem(P);
end;