日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java】ASCII类对ASCII码的处理

發布時間:2025/3/15 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】ASCII类对ASCII码的处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • ASCII類
  • ASCII碼
  • ASCII類中ASCII碼的數值表示
  • 剩下的方法
  • 總結

ASCII類

java.util.regex.ASCII類是存在的,而且是API文檔查不到的,我們看一下定義:

package java.util.regex;/*** Utility class that implements the standard C ctype functionality.** @author Hong Zhang*/final class ASCII { //... }

Utility class that implements the standard C ctype functionality.
(實現標準C ctype功能的實用程序類)
這句話告訴我們這是一個工具類。
final的定義由告訴我們這個類不能被繼承。
由于沒有訪問控制符,所以這是一個包訪問權限的類。
對Java里默認權限和protected權限不清楚的可以看這位“道友”的文章:Java訪問權限

ASCII碼

別問這種問題,我更愿意是沒有人不知道這個……
ASCII 百度百科
ASCII碼知識(自己歸納的)

ASCII類中ASCII碼的數值表示

好的親,請看這些屬性:

static final int UPPER = 0x00000100;static final int LOWER = 0x00000200;static final int DIGIT = 0x00000400;static final int SPACE = 0x00000800;static final int PUNCT = 0x00001000;static final int CNTRL = 0x00002000;static final int BLANK = 0x00004000;static final int HEX = 0x00008000;static final int UNDER = 0x00010000;static final int ASCII = 0x0000FF00;static final int ALPHA = (UPPER|LOWER);static final int ALNUM = (UPPER|LOWER|DIGIT);static final int GRAPH = (PUNCT|UPPER|LOWER|DIGIT);static final int WORD = (UPPER|LOWER|UNDER|DIGIT);static final int XDIGIT = (HEX);

解答幾個簡單的問題:

  • 0x00000100啥意思?一般人就是直接用十進制,人家全是十六進制。
  • 為啥用十六進制?更簡潔的表示二進制。
  • 為啥用那么多空余的0?一是對齊,二是Java的int是4字節,32位二進制,對應8位十六進制。
  • 為啥用的是1、2、4、8?為了貼合二進制。
  • "|"是啥?這不就是很多人從來不用的位運算符嘛……利用硬件資源,算起來更快啊……
  • 為啥感覺數值不是連續的啊?本來就不是連續的啊……

這時你說說,強不強?

然后,我們再看另一個static屬性:

private static final int[] ctype = new int[] {CNTRL, /* 00 (NUL) */CNTRL, /* 01 (SOH) */CNTRL, /* 02 (STX) */CNTRL, /* 03 (ETX) */CNTRL, /* 04 (EOT) */CNTRL, /* 05 (ENQ) */CNTRL, /* 06 (ACK) */CNTRL, /* 07 (BEL) */CNTRL, /* 08 (BS) */SPACE+CNTRL+BLANK, /* 09 (HT) */SPACE+CNTRL, /* 0A (LF) */SPACE+CNTRL, /* 0B (VT) */SPACE+CNTRL, /* 0C (FF) */SPACE+CNTRL, /* 0D (CR) */CNTRL, /* 0E (SI) */CNTRL, /* 0F (SO) */CNTRL, /* 10 (DLE) */CNTRL, /* 11 (DC1) */CNTRL, /* 12 (DC2) */CNTRL, /* 13 (DC3) */CNTRL, /* 14 (DC4) */CNTRL, /* 15 (NAK) */CNTRL, /* 16 (SYN) */CNTRL, /* 17 (ETB) */CNTRL, /* 18 (CAN) */CNTRL, /* 19 (EM) */CNTRL, /* 1A (SUB) */CNTRL, /* 1B (ESC) */CNTRL, /* 1C (FS) */CNTRL, /* 1D (GS) */CNTRL, /* 1E (RS) */CNTRL, /* 1F (US) */SPACE+BLANK, /* 20 SPACE */PUNCT, /* 21 ! */PUNCT, /* 22 " */PUNCT, /* 23 # */PUNCT, /* 24 $ */PUNCT, /* 25 % */PUNCT, /* 26 & */PUNCT, /* 27 ' */PUNCT, /* 28 ( */PUNCT, /* 29 ) */PUNCT, /* 2A * */PUNCT, /* 2B + */PUNCT, /* 2C , */PUNCT, /* 2D - */PUNCT, /* 2E . */PUNCT, /* 2F / */DIGIT+HEX+0, /* 30 0 */DIGIT+HEX+1, /* 31 1 */DIGIT+HEX+2, /* 32 2 */DIGIT+HEX+3, /* 33 3 */DIGIT+HEX+4, /* 34 4 */DIGIT+HEX+5, /* 35 5 */DIGIT+HEX+6, /* 36 6 */DIGIT+HEX+7, /* 37 7 */DIGIT+HEX+8, /* 38 8 */DIGIT+HEX+9, /* 39 9 */PUNCT, /* 3A : */PUNCT, /* 3B ; */PUNCT, /* 3C < */PUNCT, /* 3D = */PUNCT, /* 3E > */PUNCT, /* 3F ? */PUNCT, /* 40 @ */UPPER+HEX+10, /* 41 A */UPPER+HEX+11, /* 42 B */UPPER+HEX+12, /* 43 C */UPPER+HEX+13, /* 44 D */UPPER+HEX+14, /* 45 E */UPPER+HEX+15, /* 46 F */UPPER+16, /* 47 G */UPPER+17, /* 48 H */UPPER+18, /* 49 I */UPPER+19, /* 4A J */UPPER+20, /* 4B K */UPPER+21, /* 4C L */UPPER+22, /* 4D M */UPPER+23, /* 4E N */UPPER+24, /* 4F O */UPPER+25, /* 50 P */UPPER+26, /* 51 Q */UPPER+27, /* 52 R */UPPER+28, /* 53 S */UPPER+29, /* 54 T */UPPER+30, /* 55 U */UPPER+31, /* 56 V */UPPER+32, /* 57 W */UPPER+33, /* 58 X */UPPER+34, /* 59 Y */UPPER+35, /* 5A Z */PUNCT, /* 5B [ */PUNCT, /* 5C \ */PUNCT, /* 5D ] */PUNCT, /* 5E ^ */PUNCT|UNDER, /* 5F _ */PUNCT, /* 60 ` */LOWER+HEX+10, /* 61 a */LOWER+HEX+11, /* 62 b */LOWER+HEX+12, /* 63 c */LOWER+HEX+13, /* 64 d */LOWER+HEX+14, /* 65 e */LOWER+HEX+15, /* 66 f */LOWER+16, /* 67 g */LOWER+17, /* 68 h */LOWER+18, /* 69 i */LOWER+19, /* 6A j */LOWER+20, /* 6B k */LOWER+21, /* 6C l */LOWER+22, /* 6D m */LOWER+23, /* 6E n */LOWER+24, /* 6F o */LOWER+25, /* 70 p */LOWER+26, /* 71 q */LOWER+27, /* 72 r */LOWER+28, /* 73 s */LOWER+29, /* 74 t */LOWER+30, /* 75 u */LOWER+31, /* 76 v */LOWER+32, /* 77 w */LOWER+33, /* 78 x */LOWER+34, /* 79 y */LOWER+35, /* 7A z */PUNCT, /* 7B { */PUNCT, /* 7C | */PUNCT, /* 7D } */PUNCT, /* 7E ~ */CNTRL, /* 7F (DEL) */ };

這就是一個private的數組,通過之前定義的數值來表示所有的ASCII碼背后的數值。

這個數組里面裝了什么?

indexvalue
0(00)0x00002000
1(01)0x00002000
2(02)0x00002000
3(03)0x00002000
4(04)0x00002000
5(05)0x00002000
6(06)0x00002000
7(07)0x00002000
8(08)0x00002000
9(09)0x00006800
10(0A)0x00002800
11(0B)0x00002800
12(0C)0x00002800
13(0D)0x00002800
14(0E)0x00002000
15(0F)0x00002000
16(10)0x00002000
17(11)0x00002000
18(12)0x00002000
19(13)0x00002000
20(14)0x00002000
21(15)0x00002000
22(16)0x00002000
23(17)0x00002000
24(18)0x00002000
25(19)0x00002000
26(1A)0x00002000
27(1B)0x00002000
28(1C)0x00002000
29(1D)0x00002000
30(1E)0x00002000
31(1F)0x00002000
32(20)0x00004800
33(21)0x00001000
34(22)0x00001000
35(23)0x00001000
36(24)0x00001000
37(25)0x00001000
38(26)0x00001000
39(27)0x00001000
40(28)0x00001000
41(29)0x00001000
42(2A)0x00001000
43(2B)0x00001000
44(2C)0x00001000
45(2D)0x00001000
46(2E)0x00001000
47(2F)0x00001000
48(30)0x00008400
49(31)0x00008401
50(32)0x00008402
51(33)0x00008403
52(34)0x00008404
53(35)0x00008405
54(36)0x00008406
55(37)0x00008407
56(38)0x00008408
57(39)0x00008409
58(3A)0x00001000
59(3B)0x00001000
60(3C)0x00001000
61(3D)0x00001000
62(3E)0x00001000
63(3F)0x00001000
64(40)0x00001000
65(41)0x0000810A
66(42)0x0000810B
67(43)0x0000810C
68(44)0x0000810D
69(45)0x0000810E
70(46)0x0000810F
71(47)0x00000110
72(48)0x00000111
73(49)0x00000112
74(4A)0x00000113
75(4B)0x00000114
76(4C)0x00000115
77(4D)0x00000116
78(4E)0x00000117
79(4F)0x00000118
80(50)0x00000119
81(51)0x0000011A
82(52)0x0000011B
83(53)0x0000011C
84(54)0x0000011D
85(55)0x0000011E
86(56)0x0000011F
87(57)0x00000120
88(58)0x00000121
89(59)0x00000122
90(5A)0x00000123
91(5B)0x00001000
92(5C)0x00001000
93(5D)0x00001000
94(5E)0x00001000
95(5F)0x00001100
96(60)0x00001000
97(61)0x0000820A
98(62)0x0000820B
99(63)0x0000820C
100(64)0x0000820D
101(65)0x0000820E
102(66)0x0000820F
103(67)0x00000210
104(68)0x00000211
105(69)0x00000212
106(6A)0x00000213
107(6B)0x00000214
108(6C)0x00000215
109(6D)0x00000216
110(6E)0x00000217
111(6F)0x00000218
112(70)0x00000219
113(71)0x0000021A
114(72)0x0000021B
115(73)0x0000021C
116(74)0x0000021D
117(75)0x0000021E
118(76)0x0000021F
119(77)0x00000220
120(78)0x00000221
121(79)0x00000222
122(7A)0x00000223
123(7B)0x00001000
124(7C)0x00001000
125(7D)0x00001000
126(7E)0x00001000
127(7F)0x00002000

剩下的方法

看吧,基本都是位運算:

有必要先解釋ch & 0xFFFFFF80:

這里做了幾個簡單的測試,測試結果反映了的情況是:0~127之間的數代入上面的表達式,結果為0。

具體的推導可以用二進制推一下,OK的。

好了,接下來看各個方法:

  • getType():通過與0xFFFFFF80做按位與,再與0做數值相等判斷,進而進行類型推斷。static int getType(int ch) {return ((ch & 0xFFFFFF80) == 0 ? ctype[ch] : 0); }
  • isType():通過getType()返回的結果(是ASCII返回ctype數組對應索引下的值,否則返回0),如果type數值與getType()返回值不至于完全不匹配,則返回true。static boolean isType(int ch, int type) {return (getType(ch) & type) != 0; }
  • isAscii():判斷ch在不在ASCII碼表內。static boolean isAscii(int ch) {return ((ch & 0xFFFFFF80) == 0); }
  • isAlpha():判斷字符ch是否為英文字母。
    其對應的標注C函數也是進行判斷,若為英文字母,返回非0(小寫字母為2,大寫字母為1)。若不是字母,返回0。在標準c中相當于使用“ isupper( ch ) || islower( ch ) ”做測試。static boolean isAlpha(int ch) {return isType(ch, ALPHA); }
  • isDigit():檢查其參數ch是否為十進制數字字符。static boolean isDigit(int ch) {return ((ch-'0')|('9'-ch)) >= 0; }
  • isAlnum():判斷字符變量ch是否為字母或數字,若是則返回非零,否則返回零。static boolean isAlnum(int ch) {return isType(ch, ALNUM); }
  • isGraph():測試字符是否為可打印字符static boolean isGraph(int ch) {return isType(ch, GRAPH); }
  • isPrint():判斷字符ch是否為可打印字符(含空格)說明:當ch為可打印字符(0x20-0x7E)時,返回非零值,否則返回零。static boolean isPrint(int ch) {return ((ch-0x20)|(0x7E-ch)) >= 0; }
  • isPunct():檢查參數ch是否為標點符號或特殊符號。返回true也就是代表參數ch為非空格、非數字和非英文字母。static boolean isPunct(int ch) {return isType(ch, PUNCT); }
  • isSpace():檢查參數c是否為空格字符。static boolean isSpace(int ch) {return isType(ch, SPACE); }
  • isHexDigit():檢查其參數ch是否為十六進制數字字符。static boolean isHexDigit(int ch) {return isType(ch, HEX); }
  • isOctDigit():檢查其參數ch是否為八進制數字字符。static boolean isOctDigit(int ch) {return ((ch-'0')|('7'-ch)) >= 0; }
  • isCntrl():檢查所傳的字符是否是控制字符。static boolean isCntrl(int ch) {return isType(ch, CNTRL); }
  • isLower():檢查所傳的字符是否是小寫字母。static boolean isLower(int ch) {return ((ch-'a')|('z'-ch)) >= 0; }
  • isUpper():檢查所傳的字符是否是大寫字母。static boolean isUpper(int ch) {return ((ch-'A')|('Z'-ch)) >= 0; }
  • isWord():檢查所傳的字符是不是可以用32位二進制表示的"字"。static boolean isWord(int ch) {return isType(ch, WORD); }
  • toDigit():字符轉換成數值。static int toDigit(int ch) {return (ctype[ch & 0x7F] & 0x3F); }
  • toLower():大寫字母轉換成小寫字母,如果已經是小寫的就不變。static int toLower(int ch) {return isUpper(ch) ? (ch + 0x20) : ch; }
  • toUpper():小寫字母轉換成大寫字母,如果已經是大寫的就不變。static int toUpper(int ch) {return isLower(ch) ? (ch - 0x20) : ch; }
  • 總結

    ASCII類存在的意義簡而言之是進行某種轉換,將所謂的判斷轉換成實現標準C函數的功能。
    它不是一個特別顯眼的類,但是值得研究。

    知識水平有限,難免有疏漏之處。不足之處還望指出,謝謝!!!

    總結

    以上是生活随笔為你收集整理的【Java】ASCII类对ASCII码的处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。