将字符串值转换为ASCII

时间:2020-07-25 18:01:49

标签: java type-conversion

我想获取ASCII值的值(另存为字符串)并将其转换为字符以显示消息。我尝试过这个,它会不断在int b的声明中抛出索引,这也表明str和b没有值

字符串值=“ 104101108108111”;

    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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我们可以使用Java 8 ImperativeDeclarative代码切换为Streams代码。

要观察的重点:

  1. 声明式样式更易读和易于编写。
  2. 字符串连接器比简单的字符串连接更快。
  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);
    }

}

答案 2 :(得分:-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];
  1. i++将值递增为i,但表达式中使用的是递增之前的值,这意味着如果在行之前i = 0,则结果与以下代码相同:

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

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

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

  3. ch[i]的值是char的值,通过使用int运算符将其扩展为+的值。 int的{​​{1}}值是Unicode Code Point值,您的文本也与字符的ASCII码相同。

    这意味着如果为char,则表达式(在解决问题#1之后)的计算结果为:

    i = 0

    与运行代码的输出匹配是否有问题,第二个打印的数字是int b = ch[0] + ch[1] + ch[2]; int b = `1` + `0` + `4`; int b = 49 + 48 + 52; int b = 149; (在解决问题#1之后)。

您真正想要的是获取子字符串149并将其转换为数字,然后将ASCII码值转换为"104",如下所示:

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);