簡體   English   中英

將字符串值轉換為 ASCII

[英]Convert a String Value to ASCII

我想獲取 ASCII 值的值(保存為字符串)並將其轉換為字符以顯示消息。 我試過這個,它在int b的聲明中不斷拋出一個超出范圍的索引。它還表明str和b沒有值

字符串值 = "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;
    }

使用字符串拆分 function

    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

我們可以使用Imperative 8 Streams將命令式代碼切換為Declarative式代碼。

觀察要點:

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

}

代碼注釋:

有一個內置方法可以獲取帶有字符串字符的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值。 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;

    這與運行代碼中的 output 相匹配,其中第二個打印數字是149 (在修復問題 #1 之后)。

您真正想要的是獲取 substring "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);

Output

hello

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM