在Kotlin语言中如何将字符转换为ASCII值

17

我正在使用kotlin开发一个android应用程序,需要将字符串字符转换为其ASCII值。

fun tryDiCript(cypher: String) :String {
        var cypher = "fs2543i435u@$#g#@#sagb@!#12416@@@"
        var originalText = ""

        var regEx =Regex("[a-z]")
        for(char in  regEx.findAll(cypher))
        {                 
            originalText += (char.value.toInt()).toString()            
        }
       return originalText
}

这个教程网站告诉我使用char.toInt(),但它报运行时错误,显示:

Caused by: java.lang.NumberFormatException: Invalid int: "u"

所以,如果有人知道如何将字符转换为ASCII值,请帮助我。


你的意思是将一个字符转换为它的编码吗? - JulianSoto
@JulianSoto 是的,意思是 a=97b=98 这样。 - Shankar
4个回答

16

char.value 是一个 String 类型。当你调用 String.toInt() 方法时,它期望传入的是数字字符串,例如 "1", "-123" 等等可以被解析为 Int 的字符串。所以,"f".toInt() 会抛出 NumberFormatException 异常,因为 "f" 不是一个数字字符串。

如果你确定 char.value 是只包含一个字符的 String 类型,想要获取它的 ASCII 值,你可以使用以下方法:

char.value.first().code

最终您的解决方案起作用了,感谢您。我使用了 char.value[0].toInt(),这会有什么不同吗? - Shankar
没有,没有区别。 - ice1000
不,唯一的区别是如果字符串为空时抛出的异常。first()将会抛出NoSuchElementException,而get(Int)将会抛出StringIndexOutOfBoundsException - BakaWaii
我的情况下永远不会抛出异常,因为它在foreach循环中,谢谢 :) - Shankar

12

自 Kotlin 1.5 开始

如果您的变量是 char 类型,例如 'a',您可以直接使用 a.code

旧的方法(例如 toByte())现已被弃用。


8
你说的是ASCII,不是Unicode。所以很容易。
这是一个示例,展示了如何将字符('A')转换为其ASCII值。
fun main(vararg args: String) {
  println('A'.toByte().toInt())
}

输出结果与我们期望的相同,为65。

请注意,这不能用于 Unicode。

编辑1

我猜应该是这样工作的。

fun tryDiCript(cypher: String): String {
    var cypher = "fs2543i435u@$#g#@#sagb@!#12416@@@"
    var originalText = ""

    var regEx = Regex("[a-z]")
    for(char in regEx.findAll(cypher))
        originalText += char.value[0].toInt().toString()            
    return originalText
}

我建议您使用StringBuilder。
fun tryDiCript(cypher: String): String {
    var cypher = "fs2543i435u@$#g#@#sagb@!#12416@@@"
    val originalText = StringBuilder()

    var regEx = Regex("[a-z]")
    for(char in regEx.findAll(cypher))
        originalText.append(char.value[0].toInt())
    return originalText.toString()
}

之前有问题的代码缺失了,现在我已经更改了,请检查一下并让我知道我的错误在哪里。 - Shankar
代码出了问题,之前缺失了什么东西吗?抱歉,我不明白这句话,在逗号和问号之间有遗漏吗? - ice1000
请简单查看我的编辑后的问题,并帮我找出原因。当使用正则表达式匹配时,它无法处理字符。 - Shankar

4
我查看了@ice1000的回答,我发现下面的代码块无法工作。
fun main(vararg args: String) {
  println('A'.toByte().toInt())
}

正如我们在 Kotlin 文档 String - Kotlin 编程语言 中所看到的,StringtoByte() 函数 "将字符串解析为有符号字节数,并返回结果。" 如果字符串的内容不是数字,则会抛出一个 java.lang.NumberFormatException 异常。

但是还有另一个 String 函数叫做 toByteArray(),这个函数不要求字符串内容是数字。我的代码如下:

String tempString = "Hello"
val tempArray = tempString.toByteArray()
for (i in tempArray){
    println(i.toInt())
}

请注意,Kotlin文档中toByteArray()函数的定义:

fun String.toByteArray(
    charset: Charset = Charsets.UTF_8
): ByteArray

默认字符集为UTF-8,如果您想使用其他字符集,可以通过参数进行修改。


在代码示例中,'A' 不是一个 String - ice1000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接