2014-02-05 4 views
4

В моем приложении Form Delphi VCL Form У меня есть процедура, которая имеет параметр TBuff (определенный ранее как массив байтов). Внутри этой процедуры мне нужно преобразовать параметр в строку.Delphi - массив байтов в строку

procedure Form1.Convert(Collect: TBuff); 
var 
    str: String; 
begin 
    str := SysUtils.StringOf(Collect); 
end; 

После компиляции, я был предупрежден о наличии этой ошибки компилятора:

Incompatible types :'System.TArray<System.TByte>' and 'TBuff'

ответ

7

Проблема, с которой вы столкнулись в том, что вы определили свой собственный тип байтового массива, как это:

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, поэтому этот последний пример - это то, что вам нужно.

+2

+1 Прекрасный ответ –

+2

Просто обратите внимание, что Delphi XE2 добавил свойство .ANSI в TEncoding, которое вы можете использовать вместо .Default (который теперь возвращает UTF8, если вы находитесь на Mac OSX.) В тех случаях, когда я знаю массив байтов это ANSI. Я переключился на использование свойства .ANSI, чтобы быть более явным (а также в случае, если они решили изменить значение по умолчанию.) – MarkF

+0

@MarkF они не изменят значение Default, но код лучше написан явно как вы предлагаете. Я изменил это. Благодарю. –

Смежные вопросы