2009-04-21 7 views
5

¿Cuál es la mejor forma de convertir una matriz de bytes declarados como TBytes a un RawByteString en Delphi 2009? Este código funciona en realidad, tal vez hay una manera más rápida (sin circular):¿Cómo puedo convertir TBytes en RawByteString?

function Convert(Bytes: TBytes): RawByteString; 
    var 
    I: Integer; 
    begin 
    SetLength(Result, Length(Bytes)); 
    for I := 0 to ABytes - 1 do 
     Result[I + 1] := AnsiChar(Bytes[I]); 
    end; 

Respuesta

6

Usted podría considerar el uso de movimiento (no probado)

function Convert(const Bytes: TBytes): RawByteString; 
begin 
    SetLength(Result, Length(Bytes)); 
    Move(Bytes[0], Result[1], Length(Bytes)) 
end; 

Y el uso de "const" para el parámetro de modo que la matriz es no copiado dos veces

+1

'SetLength()' llamará a 'ReallocMem' para cambiar el tamaño del RawByteString existente, por lo que esta versión quizás innecesaria' move() 'los datos anteriores, sin necesidad, p. si llamas esto en un bucle. 'SetString (Resultado, PAnsiChar (Bytes), length (Bytes)' será más rápido. –

6

Y recuerda que para la prueba:

SI Longitud (bytes)> 0 se mueve, entonces .....

5

No se olvide de asignar una página de códigos a los datos RawByteString de manera que los datos de carácter se convierte correctamente si alguna vez se le asigna a cualquier otro tipo de encordado:

function Convert(const Bytes: TBytes): RawByteString; 
begin 
    SetLength(Result, Length(Bytes)); 
    if Length(Bytes) > 0 then 
    begin 
    Move(Bytes[0], Result[1], Length(Bytes)); 
    SetCodePage(Result, ..., False); 
    end; 
end; 
11

La mejor forma de hacerlo es la siguiente:

function Convert(const Bytes: TBytes): RawByteString; inline; 
begin 
    SetString(Result, PAnsiChar(pointer(Bytes)), length(Bytes)); 
end; 

Y no se olvide de usar los parámetros de const para Bytes, para un código generado algo más rápido.

Cuestiones relacionadas