FreePascal/Lazarus: Почему видно содержимое бинарных файлов?

Я использую типизированный файл с таким форматом записи:

  KClientServerConfType = Record
    HostName: String[255];
    DatabaseName: String[200];
    UserName: String[200];
    Password: String[200];
  end;  

Это работает нормально. Но как я могу прочитать содержимое файла с помощью GEdit? Я узнаю значения среди искаженного текста. Это нормально или он должен быть нечитаемым?

Вот код, который нужно написать:

  AssignFile(ThisFile, 'clientserver.conf');
  Rewrite(ThisFile);
  Settings.HostName:= '192.168.100.100';
  Settings.DatabaseName:= 'dbESM';
  Settings.UserName:= 'itsols';
  Settings.Password:= 'pass12d3';
  Write(ThisFile, Settings);
  CloseFile(ThisFile);

Я использую Lazarus на Ubuntu 12.04.


person itsols    schedule 05.06.2014    source источник
comment
Что касается RTL, это нормально.   -  person Sertac Akyuz    schedule 05.06.2014
comment
Если FPC обрабатывает короткие строки аналогично Delphi, то вероятная причина в том, что то, что вы видите, включает байт длины каждой строки (например, значение в HostName[0]) и случайные данные между фактической длиной каждой строки и ее объявленная длина, например HostName[16] ... HostName[200], если ваша переменная Settings является локальной переменной.   -  person MartynA    schedule 05.06.2014
comment
Хммм... У меня сложилось впечатление, что String[255] является пределом MAX, и поле будет корректироваться в соответствии с данными. Я снова ошибся :/   -  person itsols    schedule 05.06.2014
comment
@MartynA Итак, если я хочу сделать данные в моем файле нечитаемыми редактором, является ли шифрование/кодирование единственным способом?   -  person itsols    schedule 05.06.2014
comment
@itsols: Да, я так думаю. Кстати, поле будет корректироваться в соответствии с данными: это было бы, если бы вы записывали в обычный текстовый файл, но если вы используете файл ClientServerConfType, вы получите [] 0 байт в файле, а также мусор за пределами динамической длины строк.   -  person MartynA    schedule 05.06.2014
comment
Возможно, кто-то должен поместить это в ответ ... Здесь довольно полезные советы.   -  person itsols    schedule 05.06.2014


Ответы (1)


Если FPC обрабатывает короткие строки аналогично Delphi, то вероятная причина в том, что то, что вы видите, включает байт длины каждой строки (например, значение в HostName[0]) и случайные данные между фактической длиной каждой строки и ее объявленная длина, например HostName[16] ... HostName[200], если ваша переменная Settings является локальной переменной; если это локальная переменная, случайным материалом будет то, что ранее было в памяти до вашей переменной.

«поле будет корректироваться в соответствии с данными»: (в Delphi) это было бы, если бы вы писали в обычный текстовый файл, но если вы используете «Файл ClientServerConfType», вы получите [0] байтов в файл, а также мусор за пределами динамической длины строк.

Между полями записи в файле могут быть дополнительные, вероятно заполненные мусором, отступы, если запись не объявлена ​​как «упакованная».

person MartynA    schedule 05.06.2014
comment
Но разве строки не упакованы по умолчанию? Я только помню, что в 1990 году мне пришлось указать PACKED. - person itsols; 05.06.2014
comment
Извините, я понятия не имею об упаковке в FPC. ISTR современный Delphi имеет тенденцию по умолчанию распаковывать записи, чтобы выровнять поля записи по оптимальным границам для скорости доступа к процессору. - person MartynA; 05.06.2014
comment
itols: Строки упакованы, а записи нет. В FPC это зависит от режима (режим IOW TP имеет значения по умолчанию TP, 32-разрядный режим Delphi имеет значения по умолчанию 32-разрядного Delphi, если он не конфликтует с архитектурой. 64-разрядный FPC старше, чем 64-разрядный Delphi, поэтому может не иметь обратной совместимости с delphi из-за обратной совместимости со старыми версиями FPC. - person Marco van de Voort; 08.06.2014