Проблема, с которой вы столкнулись в том, что вы определили свой собственный тип байтового массива, как это:
type
TBuff = array of Byte;
Этот частный тип не является совместимым с другими типами байтовых массивов. Большинство RTL-функций, которые используют байтовые массивы, используют RTL-тип TBytes
, который объявлен как TArray<Byte>
.
Первое, что вам нужно сделать, это удалить TBuff
из вашей программы и вместо этого использовать TBytes
. Если вы продолжаете использовать TBuff
, вы обнаружите, что весь ваш массив байтов живет в своем собственном гетто, не в состоянии взаимодействовать с библиотечной функциональностью, которая использует TBytes
. Итак, сбегите из гетто и удалите свой тип TBuff
.
Теперь, чтобы преобразовать массив байтов в строку, вам необходимо предоставить информацию о кодировке, чтобы сделать это. Вы выбрали StringOf
, который в наши дни следует считать устаревшей. Лучше быть более явным в вашем преобразовании и использовать TEncoding
.
Например, если массив байт UTF-8 Вы пишете:
str := TEncoding.UTF8.GetString(ByteArray);
Если массив байт кодируется в локальной кодировке ANSI вы пишете:
str := TEncoding.ANSI.GetString(ByteArray);
В вашем случае использование StringOf
указывает, что массив байтов кодируется ANSI, поэтому этот последний пример - это то, что вам нужно.
+1 Прекрасный ответ –
Просто обратите внимание, что Delphi XE2 добавил свойство .ANSI в TEncoding, которое вы можете использовать вместо .Default (который теперь возвращает UTF8, если вы находитесь на Mac OSX.) В тех случаях, когда я знаю массив байтов это ANSI. Я переключился на использование свойства .ANSI, чтобы быть более явным (а также в случае, если они решили изменить значение по умолчанию.) – MarkF
@MarkF они не изменят значение Default, но код лучше написан явно как вы предлагаете. Я изменил это. Благодарю. –