Возможно ли преобразовать набор чисел в их значения символов ASCII?

#delphi #char #ascii #chr #ord

#delphi #символ #ascii #chr #ord

Вопрос:

Я могу преобразовать строку в значения Ascii с пробелами между ними.

Пример: «Я люблю морковь» в: 73 32 108 105…

Но я пытаюсь найти способ взять эти ЧИСЛА и преобразовать их ОБРАТНО в их символы ascii.

Я использую последнюю версию Delphi (embarcadero) и новичок в программировании, поэтому, пожалуйста, помогите мне 🙂

Комментарии:

1. Ответ — да, но вы должны свести свою проблему к конкретной проблеме, которую вы не можете решить. Другими словами: что вы пробовали до сих пор?

2. Возможно, вы уже знаете это, но набор символов ASCII состоит всего из 128 символов. Так, например, ни один из символов в ÅÄÖαβγδεޗสჱꡤሞ턀∫∑∏∪∩∧∂⊕☃ не является символом ASCII. Собственный символьный тип Delphi начиная с Delphi 2009 — это WideChar 16-разрядный символ Юникода.

3. Довольно интересно, что вы помещаете два правильных ответа в свой вопрос в виде тегов! Да, оба Char(65) и Chr(65) возвращают 'A' . 🙂

4. Домашнее задание нашему сообществу? 😉

Ответ №1:

Вы можете использовать функцию Ord для каждого символа. Функция Chr возвращает символ для указанного значения ASCII.

Пример

 var
  s: string;
  c: char;

s:='I like carrots';
for c in s do
begin
   Writeln(ord(c));
end;
  

Комментарии:

1. Chr также работает для символов, отличных от ASCII: Chr($222b) для знака целого числа.

2. Как пример кода связан с заданным вопросом?

Ответ №2:

Вот код:

 var
    S1 : String;
    S2 : String;
    A  : TStringDynArray;   // Add System.Types in uses
    N  : String;
    C  : Char;
begin
    // 'I like carrots' in ascii code separated by a space
    S1 := '73 32 108 105 107 101 32 99 97 114 114 111 116 115';
    A  := SplitString(S1, ' ');   // Add System.StrUtils in uses
    S2 := '';
    for N in A do
        S2 := S2   Char(StrToInt(N));
    ShowMessage(S2);
end;
  

Я не знаю всей проблемы, но вы могли бы добавить код для проверки допустимой входной строки.

Комментарии:

1. (1) Почему бы не использовать S1.Split([#32]) вместо этого? Тогда вам не нужно ничего включать. (2) Создание строки по одному символу за раз является расточительным. Лучше предварительно распределить, а затем заполнить.

2. Рассмотрите возможность использования TStringBuilder вместо добавления 1 Char за раз к String , что очень неэффективно для памяти. И вы можете отказаться от TStringDynArray if вместо этого вы используете Pos/Ex() Copy() для извлечения каждой разделенной подстроки.

3. @AndreasRejbrand RemyLebeau ваши предложения, конечно, хороши, но они усложнят код для новичка и приведут его в замешательство. Код, который я показываю, выполняет свою работу и легко понятен. OP оптимизирует свой код, как только он освоит базис, и если возникнет какая-либо необходимость (вопрос здесь выглядит как домашняя работа для студента).

4. @RemyLebeau Цель заключается не в производительности, а в преобразовании в символ / строку. Что касается производительности, 1. TStringBuilder на самом деле работает медленнее, чем наивная конкатенация строк для небольших строк. IMHO TStringBuilder — это анти-шаблон, пришедший из мира C # / Java. И 2. выражение Char() выполняет скрытое преобразование из char в string перед добавлением — это на самом деле медленнее, чем сама конкатенация.

5. @Арнаудбушез: Я также не большой поклонник строкового конструктора, но я думаю, мы все можем согласиться, что SetLength(S2, Length(A)); for k := 0 to High(A) do S2[i 1] := Chr(StrToInt(A[k])) это значительно быстрее, чем код в этом A для очень больших значений Length(A) . Но, конечно, @fpiette совершенно прав в том, что его подход легче понять и во многих случаях более чем достаточно быстр.

Ответ №3:

Я мало что знаю о delphi, но взгляните на эту ссылку: http://www.delphibasics.co.uk/Article.asp?Name=Text

В разделе «Присвоение символьным переменным и из них» он демонстрирует такую функцию: fromNum := Chr(65); // Assign using a function .

Если это не сработает, вы могли бы рассмотреть возможность создания большого сопоставления int-> char . Начало которого находится на вышеупомянутом веб-сайте также вверху.

Комментарии:

1. Я бы не рекомендовал вам использовать DelphiBasics; он содержит слишком много неточностей и не является актуальным. Кроме того, страница, на которую вы ссылаетесь, кажется, написана до Unicode (в прошлом тысячелетии). Кроме того, не существует такого понятия, как «набор символов Ansi» (ни сейчас, ни тогда). Построение массива вообще не требуется.