Java實(shí)現(xiàn)字符串轉(zhuǎn)換為十進(jìn)制ASCII碼的實(shí)戰(zhàn)指南
將Java字符串轉(zhuǎn)換為十進(jìn)制ASCII碼是文本處理、協(xié)議編碼、數(shù)據(jù)序列化和底層通信中的常見需求。這一過程涉及字符編碼、數(shù)值轉(zhuǎn)換和格式化輸出等多個(gè)技術(shù)層面。
一、核心認(rèn)知:字符串與ASCII的本質(zhì)關(guān)系
Java字符串的雙層結(jié)構(gòu)
| 層次 | 類型 | 說明 |
|---|---|---|
| 邏輯層 | String(Unicode字符序列) | 人類可讀的文本 |
| 物理層 | byte[](UTF-16或指定編碼) | JVM內(nèi)部存儲或網(wǎng)絡(luò)傳輸字節(jié) |
關(guān)鍵洞察:Java的char本質(zhì)上是UTF-16編碼單元(0-65535),而ASCII僅是其子集(0-127)。轉(zhuǎn)換時(shí)需明確處理范圍溢出。
ASCII碼范圍界定
| 類型 | 十進(jìn)制范圍 | 說明 |
|---|---|---|
| 標(biāo)準(zhǔn)ASCII | 0-127 | 7位編碼,全球通用 |
| 擴(kuò)展ASCII | 128-255 | 8位,平臺相關(guān)(ISO-8859-1等) |
| 非ASCII(Unicode) | 256-65535 | 中文、 emoji 等,超出傳統(tǒng)ASCII |
轉(zhuǎn)換策略選擇
- 嚴(yán)格ASCII環(huán)境:過濾或報(bào)錯處理非ASCII字符
- 擴(kuò)展場景:輸出大于127的十進(jìn)制值,或明確標(biāo)注為Unicode碼點(diǎn)
二、轉(zhuǎn)換場景分類
場景A:單字符轉(zhuǎn)十進(jìn)制ASCII
| 輸入字符 | 內(nèi)部編碼 | 十進(jìn)制輸出 | 說明 |
|---|---|---|---|
'A' | U+0041 | 65 | 大寫字母A |
'a' | U+0061 | 97 | 小寫字母a |
'0' | U+0030 | 48 | 數(shù)字字符0 |
'\n' | U+000A | 10 | 換行控制符(LF) |
'\r' | U+000D | 13 | 回車控制符(CR) |
' ' | U+0020 | 32 | 空格(Space) |
'中' | U+4E2D | 20013 | 中文字符(超ASCII) |
場景B:字符串批量轉(zhuǎn)換
| 模式 | 輸入 | 十進(jìn)制輸出示例 | 適用場景 |
|---|---|---|---|
| 緊湊連續(xù) | "ABC" | "656667" | 緊湊存儲、無分隔 |
| 空格分隔 | "ABC" | "65 66 67" | 可讀調(diào)試、日志輸出 |
| 逗號分隔 | "ABC" | "65,66,67" | CSV格式、數(shù)據(jù)交換 |
| 數(shù)組格式 | "ABC" | "[65, 66, 67]" | 編程語言風(fēng)格 |
| 定寬格式 | "ABC" | "065 066 067" | 對齊顯示、固定寬度 |
| 混合標(biāo)注 | "A\n" | "65(10)" | 控制字符特殊標(biāo)記 |
場景C:特殊處理需求
| 需求 | 處理方式 | 示例 |
|---|---|---|
| 非ASCII過濾 | 替換為占位符或跳過 | "A中B" → "65 66" |
| 非ASCII保留 | 輸出完整Unicode碼點(diǎn) | "A中B" → "65 20013 66" |
| 控制字符轉(zhuǎn)義 | 輸出名稱而非數(shù)值 | "\n" → "LF" 或 "10(LF)" |
| 字節(jié)序標(biāo)記 | 添加BOM標(biāo)識 | "\uFEFFABC" → 65279 65 66 67 |
三、代碼實(shí)現(xiàn)
/**
* 字符串轉(zhuǎn)十進(jìn)制ASCII碼
*
* @param str
* @return {@link List}<{@link Byte}>
*/
public List<Byte> strToAscii(String str) {
List<Byte> valueByte = new ArrayList<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 第二個(gè)參數(shù)16表示10進(jìn)制
Integer value = Integer.parseInt(Integer.toString(c, 10));
valueByte.add(ByteUtil.intToByte(value));
}
return valueByte;
}
四、特殊字符處理策略
控制字符可視化
| 字符 | 十進(jìn)制 | 標(biāo)準(zhǔn)名 | 替代輸出 |
|---|---|---|---|
NUL | 0 | Null | "0(NUL)" 或 "NUL" |
SOH | 1 | Start of Heading | "1(SOH)" |
STX | 2 | Start of Text | "2(STX)" |
ETX | 3 | End of Text | "3(ETX)" |
EOT | 4 | End of Transmission | "4(EOT)" |
ENQ | 5 | Enquiry | "5(ENQ)" |
ACK | 6 | Acknowledge | "6(ACK)" |
BEL | 7 | Bell | "7(BEL)" 或 "\a" |
BS | 8 | Backspace | "8(BS)" 或 "\b" |
HT | 9 | Horizontal Tab | "9(TAB)" 或 "\t" |
LF | 10 | Line Feed | "10(LF)" 或 "\n" |
VT | 11 | Vertical Tab | "11(VT)" |
FF | 12 | Form Feed | "12(FF)" 或 "\f" |
CR | 13 | Carriage Return | "13(CR)" 或 "\r" |
ESC | 27 | Escape | "27(ESC)" 或 "\e" |
SP | 32 | Space | "32" 或 "SPACE" |
DEL | 127 | Delete | "127(DEL)" |
實(shí)現(xiàn)策略:轉(zhuǎn)換前查表映射,或輸出后附加注釋。
非ASCII字符處理
| 策略 | 處理方式 | 輸出示例(輸入"中") |
|---|---|---|
| 直接輸出 | 輸出完整Unicode碼點(diǎn) | "20013" |
| 過濾剔除 | 跳過非ASCII字符 | 無輸出 |
| 替換標(biāo)記 | 替換為占位符 | "[NON-ASCII:20013]" |
| 異常拋出 | IllegalArgumentException | 中斷處理 |
| 編碼分解 | UTF-8字節(jié)序列 | "228 184 173"(3字節(jié)) |
五、性能優(yōu)化策略
| 技術(shù) | 效果 | 適用場景 |
|---|---|---|
StringBuilder預(yù)分配 | 避免擴(kuò)容,減少GC | 通用批量 |
char[]直接填充 | 無方法調(diào)用開銷 | 極致性能 |
Arrays.parallelPrefix | 并行累積 | 超大規(guī)模數(shù)組 |
IntStream并行 | 多核利用 | Java 8+大數(shù)據(jù) |
六、知識擴(kuò)展
以下是將字符串轉(zhuǎn)換為十進(jìn)制 ASCII 碼的 Java 實(shí)現(xiàn)。
代碼示例
public class StringToAscii {
/**
* 將字符串轉(zhuǎn)換為十進(jìn)制 ASCII 碼數(shù)組(每個(gè)字符對應(yīng)一個(gè) int 值)
* @param str 輸入字符串
* @return 十進(jìn)制 ASCII 碼數(shù)組
*/
public static int[] toAsciiArray(String str) {
if (str == null) {
return new int[0];
}
int[] result = new int[str.length()];
for (int i = 0; i < str.length(); i++) {
result[i] = (int) str.charAt(i); // char 自動轉(zhuǎn)換為 int,得到 Unicode 碼點(diǎn)(ASCII 字符與 ASCII 值一致)
}
return result;
}
/**
* 打印字符串每個(gè)字符的十進(jìn)制 ASCII 碼(空格分隔)
* @param str 輸入字符串
*/
public static void printAscii(String str) {
if (str == null || str.isEmpty()) {
System.out.println("字符串為空");
return;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
sb.append((int) str.charAt(i));
if (i != str.length() - 1) {
sb.append(" ");
}
}
System.out.println(sb.toString());
}
public static void main(String[] args) {
String input = "Hello";
int[] asciiValues = toAsciiArray(input);
System.out.print("十進(jìn)制 ASCII 碼: ");
for (int val : asciiValues) {
System.out.print(val + " ");
}
System.out.println();
// 直接打印
System.out.print("另一種輸出: ");
printAscii(input);
}
}運(yùn)行結(jié)果
十進(jìn)制 ASCII 碼: 72 101 108 108 111
另一種輸出: 72 101 108 108 111
代碼說明
- 核心轉(zhuǎn)換:
(int) str.charAt(i)將每個(gè)字符強(qiáng)制轉(zhuǎn)換為int,得到該字符的 Unicode 碼點(diǎn)。對于 ASCII 字符(0~127),碼點(diǎn)值就是其 ASCII 碼。 - 返回?cái)?shù)組:
toAsciiArray方法返回一個(gè)int[],便于后續(xù)處理。 - 直接打印:
printAscii方法將 ASCII 碼以空格分隔打印。 - 處理空字符串:做了簡單的空值判斷。
補(bǔ)充:如果希望得到每個(gè)字符的 ASCII 碼并拼接成字符串(如 "72101108108111")
public static String toAsciiString(String str) {
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray()) {
sb.append((int) c);
}
return sb.toString();
}七、總結(jié)
核心原則:
- 編碼范圍明確:ASCII是Unicode子集,處理前確認(rèn)范圍策略
- 分隔符約定:緊湊、空格、逗號等格式需文檔化
- 控制字符顯式化:不可打印字符特殊標(biāo)注,增強(qiáng)可讀性
- 性能分層優(yōu)化:只有實(shí)測瓶頸處使用查表等激進(jìn)方案
- 可逆性驗(yàn)證:關(guān)鍵數(shù)據(jù)確保編解碼閉環(huán)一致
以上就是Java實(shí)現(xiàn)字符串轉(zhuǎn)換為十進(jìn)制ASCII碼的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Java字符串轉(zhuǎn)十進(jìn)制ASCII碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合Redis啟動失敗的常見錯誤以及解決方法
本文詳細(xì)介紹了Spring Boot整合Redis啟動失敗的常見錯誤及其解決方法,涵蓋了服務(wù)配置、配置文件、依賴、集群配置、密碼、網(wǎng)絡(luò)、連接池、依賴沖突和Redis服務(wù)端等多個(gè)方面的問題,通過逐一排查和解決這些問題,需要的朋友可以參考下2025-11-11
淺談Spring事務(wù)傳播行為實(shí)戰(zhàn)
這篇文章主要介紹了淺談Spring事務(wù)傳播行為實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解
這篇文章主要介紹了Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解,在Java中,我們可以通過Executors類來創(chuàng)建ScheduledThreadPool,Executors類提供了幾個(gè)靜態(tài)方法來創(chuàng)建不同類型的線程池,包括ScheduledThreadPool,需要的朋友可以參考下2023-09-09
mybatis查詢結(jié)果返回至實(shí)體類的示例代碼
這篇文章主要介紹了mybatis查詢結(jié)果返回至實(shí)體類的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
實(shí)例講解Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用
這篇文章主要介紹了Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用,講解了通過條件判斷結(jié)構(gòu)來分配不同對象的責(zé)任權(quán)限,需要的朋友可以參考下2016-02-02
java使用Process調(diào)用exe程序及Process.waitFor()死鎖問題解決
在編寫Java程序時(shí),有時(shí)候我們需要調(diào)用其他的諸如exe,shell這樣的程序或腳本,下面這篇文章主要給大家介紹了關(guān)于java使用Process調(diào)用exe程序及Process.waitFor()死鎖問題解決的相關(guān)資料,需要的朋友可以參考下2022-12-12
多線程Thread,Runnable,Callable實(shí)現(xiàn)方式
這篇文章主要為大家詳細(xì)介紹了Java多線程如何實(shí)現(xiàn)Thread,Runnable,Callable的方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Java實(shí)現(xiàn)一個(gè)簡易版的多級菜單功能
這篇文章主要給大家介紹了關(guān)于Java如何實(shí)現(xiàn)一個(gè)簡易版的多級菜單功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理
這篇文章主要介紹了Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

