【问题标题】:Is it Possible to convert a set of numbers to their ASCII Char values?是否可以将一组数字转换为其 ASCII Char 值?
【发布时间】:2020-10-06 18:28:44
【问题描述】:

我可以将字符串转换为 Ascii 值,中间有空格。

示例:“我喜欢胡萝卜” 至:73 32 108 105...

但我正在尝试找出一种方法来获取这些数字并将它们转换回它们的 ascii 字符。

我正在使用最新版本的 Delphi (embarcadero),并且是编码新手,所以请帮助我:)

【问题讨论】:

  • 答案是肯定的,但您必须将您的问题简化为您无法解决的特定问题。换句话说:到目前为止,您尝试过什么?
  • 您可能已经知道这一点,但 ASCII 字符集仅包含 128 个字符。因此,例如,ÅÄÖαβγδεޗสჱꡤሞ턀∫∑∏∪∩∧∂⊕☃ 中的所有字符都不是 ASCII 字符。自 Delphi 2009 以来的原生 Delphi 字符类型是 WideChar,一个 16 位 Unicode 字符。
  • 很有趣的是,你把两个有效的答案放在你的 Q 上作为标签!是的,Char(65)Chr(65) 都返回 'A'。 :)
  • 家庭作业分配给我们的社区? ;)

标签: delphi char ascii chr ord


【解决方案1】:

代码如下:

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) 为什么不改用S1.Split([#32])?那么你不需要包含任何东西。 (2) 一次构建一个字符的字符串是浪费的。最好预先分配然后填充。
  • 考虑使用TStringBuilder 而不是一次将1 个Char 附加到String,这非常不利于内存。如果您使用Pos/Ex()+Copy() 来提取每个分隔的子字符串,则可以取消TStringDynArray
  • @AndreasRejbrand RemyLebeau 你的建议当然很好,但是对于初学者来说,它们会使代码变得更加复杂并且会让他感到困惑。我展示的代码可以完成这项工作并且很容易理解。一旦掌握了基础并且有任何需要,OP 将优化他的代码(这里的问题看起来像学生的家庭作业)。
  • @RemyLebeau 目的不是关于性能,而是转换为字符/字符串。关于性能, 1. TStringBuilder 对于小字符串是actually slower than naive string concatenation。恕我直言,TStringBuilder 是来自 C#/Java 世界的反模式。 2. Char() 表达式在附加之前进行从 char 到 string 的隐藏转换 - 这实际上比串联本身要慢。
  • @ArnaudBouchez:我也不是字符串生成器的忠实拥护者,但我认为我们都同意 SetLength(S2, Length(A)); for k := 0 to High(A) do S2[i + 1] := Chr(StrToInt(A[k])) 对于非常大的 @ 值比此 A 中的代码快得多987654331@。但当然,@fpiette 是完全正确的,他的方法更容易理解,而且在很多情况下都足够快。
【解决方案2】:

您可以在每个字符中使用 Ord 函数。 Chr 函数返回指定 ASCII 值的字符。

例子

var
  s: string;
  c: char;

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

【讨论】:

  • Chr 也适用于非 ASCII 字符:Chr($222b) 用于整数符号。
  • 代码示例与所提问题有何关联?
【解决方案3】:

我对delphi了解不多,但是看看这个链接:http://www.delphibasics.co.uk/Article.asp?Name=Text

在分配到和从字符变量部分中,它演示了一个函数,如下所示: fromNum := Chr(65); // Assign using a function.

如果这不起作用,您可以考虑构建一个大型的 int->char 映射。上面的网站也靠近顶部。

【讨论】:

  • 我不推荐你使用 DelphiBasics;它包含太多的不准确之处,并且不是最新的。此外,您链接到的页面似乎是在 Unicode(上个千年)之前编写的。此外,没有“Ansi 字符集”之类的东西(不是现在,不是那时)。根本不需要构建数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2012-03-26
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
相关资源
最近更新 更多