将字符串值转换为ASCII

3

我希望将一个ASCII值(保存为字符串)转换为字符以显示一条消息。我尝试了以下代码,但在int b的声明处它抛出了一个越界索引异常,并且提示未对str和b赋值。

字符串变量 value = "104 101 108 108 111";

    char[] ch = new char[value.length()];
    for (int i = 0; i < value.length(); i++) {
        ch[i] = value.charAt(i);
    }
    System.out.println(ch.length);
    String ans = "";
    int i = 0;
    while (i+2 < ch.length) {
       
        
        int b= ch[i]+ch[i++]+ch[i+2];
        String str = new Character((char) b).toString();
        System.out.println(str);
        System.out.println(b);
    ans = ans+str;
    i=i+3;
    }

3
ch[i++] 改为 ch[i+1] - JCWasmx86
3个回答

2
使用字符串分割函数
    String value = "104 101 108 108 111";

    String[] arrOfStr = value.split(" "); 
    
    String ans = "";

    for(String str : arrOfStr) {
         String str1 = Character.toString((char)Integer.parseInt(str));
         ans += str1;
    }
    
    System.out.println(ans); // output: hello

0

我们可以使用Java 8的 Streams 技术将Imperative代码转换为 Declarative 代码。

需要注意的关键点:

  1. 声明式风格更易读且易于编写。
  2. String Joiner快于简单的字符串拼接。
  3. 无需编写迭代器。
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        String value = "104 101 108 108 111";

        Arrays.stream(value.split(" ")) // Starting a stream of String[]
            .mapToInt(Integer::parseInt) // mapping String to int
            .mapToObj(Character::toChars) // finding ASCII char from int
            .forEach(System.out::print); // printing each character
    }

}

如果您想要存储结果并打印它,这是如何完成的。
import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String value = "104 101 108 108 111";

        String result = Arrays.stream(value.split(" ")) // Starting a stream of String[]
                            .mapToInt(Integer::parseInt) // mapping String to int
                            .mapToObj(Character::toChars) // finding ASCII char from int
                            .map(String::new) // convert char to String
                            .collect(Collectors.joining()); // combining individual result using String Joiner

        System.out.println(result);
    }

}

-1

代码注释:

有一个内置方法可以获取字符串的字符数组char[],因此以下两个代码块是相同的:

// Code from question
char[] ch = new char[value.length()];
for (int i = 0; i < value.length(); i++) {
    ch[i] = value.charAt(i);
}

// Using built-in method
char[] ch = value.toCharArray();

在循环时递增一个值时最好使用 for 循环。以下两种编写循环的方式行为相同,但 for 循环将循环逻辑保持在一起:

// Code from question
int i = 0;
while (i+2 < ch.length) {
    // some code here
    i=i+3;
}

// Using for loop
for (int i = 0; i + 2 < ch.length; i=i+3) {
    // some code here
}

以下代码行完全错误:

int b= ch[i]+ch[i++]+ch[i+2];
  • i++会将i的值加1,但在表达式中使用的是增加前的值,这意味着如果在该行之前i=0,则结果与此代码相同:

    int b = ch[0] + ch[0] + ch[2];
    i = i + 1;
    

    您需要用i+1替换i++,并意识到它们不是相同的

  • 由于在该语句中不再将i的值增加1,因此必须将循环从i=i+3更改为i=i+4,以正确跳过输入中的空格。

  • ch[i]的值是一个char值,通过使用+运算符扩展为int值。 charint值是Unicode代码点值,对于您的文本也是字符的ASCII代码。

    这意味着如果i=0,则表达式(修复问题#1后)将计算为:

    int b = ch[0] + ch[1] + ch[2];
    
    int b = `1` + `0` + `4`;
    
    int b = 49 + 48 + 52;
    
    int b = 149;
    

    这与运行问题中的代码的输出匹配,其中第二个打印的数字是149(修复问题#1后)。

  • 你真正想要的是获取子字符串"104"并将其转换为数字,然后将该ASCII码值强制转换为char,像这样:

    String numberStr = value.substring(i, i + 3); // E.g. "104"
    int number = Integer.parseInt(numberStr);     // E.g. 104
    String str = String.valueOf((char) number);   // E.g. "h"
    

    有了这个,你就不再需要 char[] 了,所以最终的代码将是:

    String value = "104 101 108 108 111";
    
    String ans = "";
    for (int i = 0; i + 2 < value.length(); i += 4) {
        String numberStr = value.substring(i, i + 3);
        int number = Integer.parseInt(numberStr);
        String str = String.valueOf((char) number);
        ans = ans + str;
    }
    System.out.println(ans);
    

    输出

    hello
    

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