Para String
específicamente, puede utilizar SysUtils.ByteLength()
para obtener la longitud de bytes de los datos de caracteres, y si no es cero, entonces incrementar el resultado por SizeOf(System.StrRec)
(que es la cabecera delante de los datos de caracteres) y SizeOf(Char)
(para el terminador nulo que no está incluido en la longitud), por ejemplo:
var
S: string;
len: Integer;
begin
S := ...;
len := ByteLength(s);
if len > 0 then Inc(len, SizeOf(StrRec) + SizeOf(Char));
end;
por otro lado, si se quiere calcular el tamaño en bytes de otros tipos de cadenas, como AnsiString
, AnsiString(N)
(como UTF8String
), RawByteString
, etc., es necesario utilizar System.StringElementSize()
lugar, por ejemplo:
var
S: SomeStringType;
len: Integer;
begin
S := ...;
len := Length(S) * StringElementSize(S);
if len > 0 then Inc(len, SizeOf(StrRec) + StringElementSize(s));
end;
En cualquier caso, la razón por la que sólo se incrementará la longitud si la cadena tiene caracteres en ella se debe a que las cadenas vacías no ocupan ningún memoria en absoluto, son nil
punteros.
La respuesta está documentada en la documentación oficial: http://docwiki.embarcadero.com/RADStudio/en/Unicode_in_RAD_Studio –
@David - Los documentos darán lugar a una conclusión incorrecta en 64 bits, consulte mi comentario en la respuesta de opc0de. –
@Sertac No tengo computadora en este momento. ¿La diferencia entre 32 y 64 bits es simplemente 4 bytes extra de relleno? ¿Entonces la longitud sigue siendo un campo de 32 bits? –