2017-07-24 14 views
0

我有一個TBytes數組,我想像DWORD數組那樣訪問它,但我不想創建TBytes數組的新副本。我試圖對它進行類型轉換,但新變量的長度與舊的長度相同,而不是Length(TBytes)/4,因爲它應該是這樣。如果我想設置正確的長度,Delphi會複製它並且兩個數組之間的連接丟失。有可能使它工作?如何從TBytes數組訪問DWORD?

+2

使用PDWORD類型的指針變量,然後'p:= @arr [0];'將前四個字節作爲雙字讀取。 Inc(p)'指向接下來的4個字節。 –

+0

聲明類型'TDWords = DWord數組;'然後使用'絕對'指令:'var MyBytesArray:TBytes; MyDWordsArray:TDWords絕對MyBytesArray;' – Abelisto

+0

@Abelisto:以這種方式使用'absolute'將會讓你訪問'DWORD'的值,但'Length(MyDWordsArray)'不會返回正確數目的'DWORD',它將返回'Length(MyBytesArray)'而不是。 –

回答

3

您需要獲取指向數組數據的指針,然後對其進行類型轉換。只需對指針進行類型轉換不會改變您仍然指向一個字節數組的事實,這就是爲什麼長度相同。你必須通過4

除以數組長度手動計算的DWORD S上的號碼試試這個:

var 
    bytes: TBytes; 
    values, value: LPDWORD; 
    i, numValues: Integer; 
begin 
    // populate bytes as needed... 
    values := LPDWORD(bytes); 
    value := values; 
    numValues := Length(bytes) div sizeof(DWORD); 
    for I := 0 to numValues-1 do 
    begin 
    // use value^ as needed... 
    Inc(value); 
    end; 
end; 

或者,如果您使用的是德爾福2009+:

{$POINTERMATH ON} 

var 
    bytes: TBytes; 
    values: LPDWORD; 
    i, numValues: Integer; 
begin 
    // populate bytes as needed... 
    values := LPDWORD(bytes); 
    numValues := Length(bytes) div sizeof(DWORD); 
    for I := 0 to numValues-1 do 
    begin 
    // use values[i] as needed... 
    end; 
end; 
+0

謝謝。它的工作原理很好,但是如果我們增加字節數組的大小,我們必須小心,因爲數組重新定位在新地址處,所以要再次更新指針。無論如何,沒關係。 –