从字母转换到它们在字母表中的相对位置(c#)
本文关键字:相对 位置 字母表 转换 | 更新日期: 2023-09-27 18:29:41
不久前我发现了这段代码,我想了解它是如何工作的)
int index = (int)c % 32 +1;
我已经成功地使用了这一行将字母转换为数字——例如,a变成了1(a也是)。有人能解释一下这是怎么发生的吗(我已经看了一点32进制,但并不知道)?还有没有一种简单的方法可以将整数转换回字母?
所有字母都有整数代码。例如,'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开始,而小写字母 所以在你的公式中,如果我们假设 剩下的只是巧合,大写字母表和小写字母表以32的差开始,65模32为1。这使得c
总是字母表中的一个字符,我们知道它的数值在65到90之间,或者在97到122之间。因此,取字符'A'
或'a'
,我们的值分别为65或97。(int)c % 32
为您提供字母表中从1开始的字符的索引。
这之所以有效,是因为.NET中的默认字符编码是UTF-16。对于字母,这将与ASCII匹配。
如果您查看ASCII表,您将看到大写A-Z从位置65开始编码,小写A-Z从位置97开始编码。您提供的公式将返回1表示大写或小写的"A",2表示大写或大写的"B"等。
从该表中,您还应该能够将1到26之间的整数转换为您选择的大小写字符:在整数上加64表示大写,或96表示小写。