Как преобразовать строки в массив байтов и обратно
Я должен записать строки в двоичный 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);
Класс поддерживает множество других кодировок, как описано в документации. Из вопроса неясно, какую кодировку вам нужно использовать. Надеюсь, что вы можете решить все остальное отсюда.