从字母转换到它们在字母表中的相对位置(c#)

本文关键字:相对 位置 字母表 转换 | 更新日期: 2023-09-27 18:29:41

不久前我发现了这段代码,我想了解它是如何工作的)

int index = (int)c % 32 +1;

我已经成功地使用了这一行将字母转换为数字——例如,a变成了1(a也是)。有人能解释一下这是怎么发生的吗(我已经看了一点32进制,但并不知道)?还有没有一种简单的方法可以将整数转换回字母?

从字母转换到它们在字母表中的相对位置(c#)

所有字母都有整数代码。例如,'a'具有代码97。所以CCD_ 2是97。所以(int)'a' % 32是1。因为只有不到32个英文字母,所以所有的字母都能正确转换。同样巧合的是,上下字母之间的差值是32(例如'a' - 'A' == 32)。所以这适用于大写字母。

若要将整数转换回字母,还可以使用整数代码。例如,'A' + index - 1会给出字母表中编号为index的大写字母。此外,'a' + index - 1将给出具有相同数字的较低字母。

以ASCII为例,可以查看符号的整数代码。

这一切都是由于字符(和字符串)的实际表示方式。每个字符都使用代码点进行编码,代码点只是数字。许多代码点组成了一个代码页,它本质上是一个将数字映射到实际字符的表。

忽略Unicode附带的大型代码页,您现在只需查看ASCII,它是前128个代码点的编码。在那里,你可以看到标准的大写字母从数字65开始,而小写字母

所以在你的公式中,如果我们假设c总是字母表中的一个字符,我们知道它的数值在65到90之间,或者在97到122之间。因此,取字符'A''a',我们的值分别为65或97。

剩下的只是巧合,大写字母表和小写字母表以32的差开始,65模32为1。这使得(int)c % 32为您提供字母表中从1开始的字符的索引。

这之所以有效,是因为.NET中的默认字符编码是UTF-16。对于字母,这将与ASCII匹配。

如果您查看ASCII表,您将看到大写A-Z从位置65开始编码,小写A-Z从位置97开始编码。您提供的公式将返回1表示大写或小写的"A",2表示大写或大写的"B"等。

从该表中,您还应该能够将1到26之间的整数转换为您选择的大小写字符:在整数上加64表示大写,或96表示小写。