works:programmer:delphi:fps-string-max-bytes

Максимальная длина строки

Забавный случай в FreePascal 3й версии идёт абсолютно классическое поведение строки как в старых версиях Delphi 6 и 7.

То-есть длина строки (type String) не может быть длиннее чем 255 байт…

Связано это с тем что строка в pascal передается как [1 байт длина][N байт буфер]

Что позволяет например получить длину строки с помощью byte(str[0]) и получить Pointer на первый символ через @str[1] ..

В Delphi более поздних версий буфер строки составляется из блоков [1 байт длина][N байт буфер][1 байт длина][N байт буфер]

То-есть если первый байт будет 255 то он добавляет еще один дополнительный буфер… [6][….] или [255][….][13][……]

Забавное поведение, но иногда создает дикие подводные камни в обработке строк… Из чего выходит что всё-таки используйте TStringstream, TStringBuilder или StrAlloc(N) для строительства заведомо длинных строк…

//fpc 3.0.0
program HelloWorld;
 
var
    str: String;
    plen: ^byte;
    len: byte;
 
begin
    str := '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' // 100
        +  '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' // 200
        +  '01234567890123456789012345678901234567890123456789' + (* 250 *) '01234' + (* 255 *) '__AND_THIS_WILL_IGNORED__';
    //plen := @str[0];
    //len := plen^;
    len := byte(str[0]);
 
    writeln(len, ' ', length(str), ' ', str);   // 255 255 ....
end.
works/programmer/delphi/fps-string-max-bytes.txt · Last modified: 2019/10/25 22:51 by Chugreev Eugene