Как преобразовать строки в массив байтов и обратно

Я должен записать строки в двоичный MIDI-файл. Стандарт требует, чтобы один знал длину строки в байтах. Поскольку я также хочу писать для мобильных устройств, я не могу использовать AnsiString, что было хорошим способом убедиться, что строка является однобайтовой строкой. Это упростило вещи. Я проверил следующий код:

TByte = array of Byte;

function TForm3.convertSB (arg: string): TByte;
var
   i: Int32;
begin
   Label1.Text := (SizeOf (Char));
   for i := Low (arg) to High (arg) do
   begin
      label1.Text := label1.Text + ' ' + IntToStr (Ord (arg [i]));
   end;
end; // convert SB //

convertSB ('MThd');

Возвращает 2 77 84 104 100 (в виде текста метки) в Windows и Android. Означает ли это, что Delphi по умолчанию обрабатывает строки как UTF-8? Это сильно упростит ситуацию, но я не смог найти ее в справке. И каков наилучший способ преобразовать это в массив байтов? Прочитать каждый символ и проверить, является ли он 1, 2 или 4 байтами и выделить это место в массиве? Для преобразования обратно в символ: просто читайте массив байтов, пока не встретите байт < 128?

1 ответ

Решение

Строки Delphi кодируются внутренне как UTF-16. Был большой ключ в том, что SizeOf(Char) это 2.

Причина того, что все ваши символы имели порядковый номер в диапазоне ASCII, заключается в том, что UTF-16 расширяет ASCII в том смысле, что символы от 0 до 127 в диапазоне ASCII имеют одинаковое порядковое значение в UTF-16. И все ваши персонажи - символы ASCII.

Тем не менее, вам не нужно беспокоиться о внутренней памяти. Вы просто конвертируете между строкой и байтовым массивом, используя TEncoding учебный класс. Например, чтобы конвертировать в UTF-8, вы пишете:

bytes := TEncoding.UTF8.GetBytes(str);

И в обратном направлении:

str := TEncoding.UTF8.GetString(bytes);

Класс поддерживает множество других кодировок, как описано в документации. Из вопроса неясно, какую кодировку вам нужно использовать. Надеюсь, что вы можете решить все остальное отсюда.

Другие вопросы по тегам