2016-04-04 12 views
-1

Ich habe ein String Objekt in Delphi. Ich möchte das in TByteDynArray konvertieren. Ich habe die Implementierung unten versucht. Aber während des Debuggen finde ich, dass binaryData nach der Zuweisung leer ist. Was mache ich falsch?Umwandlung von String in TByteDynArray

procedure convertStringToTByteDynArray; 
var 
    binaryData:TByteDynArray; 
    Data: String; 

begin 
    Data := '8080100B1D472'; 
    //Copy over string to TByteDynArray 
    SetLength(binaryData,Length(Data)); 
    Move(Data[1],binaryData,Length(Data)); 
end 
+0

Wissen Sie, was kodieren, die Sie verwenden möchten? –

Antwort

4

Die Größe Char ist 1 Byte in Delphi 2007 und früher, aber ist 2 Bytes in Delphi 2009 und später. Im letzteren Fall wird der Code UTF-16-Daten in das Bytearray einfügen, aber nur die Hälfte der Zeichen kopieren.

Der Hauptfehler, den Sie machen, besteht darin, dass die Übergabe binarydata von selbst an Move() den Speicherort der Variablen selbst übergibt, die nur ein Zeiger auf anderen Speicher ist. Die Übergabe von binarydata[0] übergibt stattdessen den Speicherort des ersten Elements des zugewiesenen Speichers, auf den TByteDynArray zeigt. Das musst du stattdessen bestehen.

Ich habe auch eine Length() Prüfung hinzugefügt, die einige Entfernungsüberprüfungsfehler vermeidet, wenn diese aktiviert sind.

procedure convertStringToTByteDynArray; 
var 
    binaryData: TByteDynArray; 
    Data: String; 
begin 
    Data := '8080100B1D472'; 
    //Copy over string to TByteDynArray 
    SetLength(binaryData, Length(Data) * sizeof(Char)); 
    if Length(Data) > 0 then 
    Move(Data[1], binaryData[0], Length(Data) * sizeof(Char)); 
end; 

Alternativ:

procedure convertStringToTByteDynArray; 
var 
    binaryData: TByteDynArray; 
    Data: String; 
begin 
    Data := '8080100B1D472'; 
    //Copy over string to TByteDynArray 
    SetLength(binaryData, Length(Data) * sizeof(Char)); 
    Move(PChar(Data)^, PByte(binaryData)^, Length(binaryData)); 
end; 
+0

Oder vermeiden Sie 'if' mit' Move (Pointer (Daten) ^, Pointer (BinaryData) ^, Length (BinaryData)) 'weil' if' nur zur Bereichsüberprüfung benötigt wird. –

+0

Erwähnenswert ist, dass ich in der Version von ** Move ** (Delphi 7 - neuere Versionen nicht sofort zur Hand) nach einer NIL * Quelle * suche, aber nicht nach einem NIL * Ziel * (was zu einer Zugriffsverletzung führen wird). d. h. wenn ** Move ** verwendet wird, ist ein ** if ** zum Schutz vor einer NIL-Quelle (in diesem Fall leer * Data *) redundant. Ein Schutz gegen ein NIL * -Ziel * kann jedoch immer noch erforderlich sein (in diesem Fall nicht, da die Implementierung der Funktion convert ... sicherstellt, dass das Ziel (* binaryData *) nur NIL ist, wenn Data ebenfalls NIL ist, dh leer). – Deltics

+0

@Deltics Wenn die Länge Null ist, wird sicher keiner der ersten beiden Arrrichtungen de-referenziert –