[code="java"]
public static int charType(String str) {
if (str != null && str.length() > 0) {
byte[] b = str.getBytes();
byte b1 = b[0];
byte b2 = b.length > 1 ? b[1] : 0;
if (getUnsigned(b1) < 128) {
if ("\"!,.?()[]{}+=".indexOf((char) b1) != -1)
return CT_DELIMITER;
return CT_SINGLE;
} else if (getUnsigned(b1) == 162)
return CT_INDEX;
else if (getUnsigned(b1) == 163 && getUnsigned(b2) > 175 && getUnsigned(b2) < 186)
return CT_NUM;
else if (getUnsigned(b1) == 163
&& (getUnsigned(b2) >= 193 && getUnsigned(b2) <= 218 || getUnsigned(b2) >= 225
&& getUnsigned(b2) <= 250))
return CT_LETTER;
else if (getUnsigned(b1) == 161 || getUnsigned(b1) == 163)
return CT_DELIMITER;
else if (getUnsigned(b1) >= 176 && getUnsigned(b1) <= 247)
return CT_CHINESE;
}
return CT_OTHER;
}
public static int getUnsigned(byte b) {
if (b > 0)
return (int) b;
else
return (b & 0x7F + 128);
}
[/code]
176对应的是字符'0'的ASCII码,186对应的是字符'9'的ASCII码,所以[code="java"]
getUnsigned(b2) > 175 && getUnsigned(b2) < 186[/code]的意思是表示'0'-'9'之间的字符,依此类推,193对应的是字符'A'的ASCII码......
如果哪个数字不知道是什么意思,用下面的代码打印出其对应的ASCII码,然后对照ASCII码表看就明白了:
[code="java"]
package org.zergle.test.byte2uint;
public class Byte2UInt {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println((176 - 128) & 0x7F); // '0'
System.out.println((186 - 128) & 0x7F); // '9'
System.out.println((175 - 128) & 0x7F); // '/'
System.out.println((163 - 128) & 0x7F); // '#'
System.out.println((193 - 128) & 0x7F); // 'A'
System.out.println((218 - 128) & 0x7F); // 'Z'
System.out.println((225 - 128) & 0x7F); // 'a'
System.out.println((250 - 128) & 0x7F); // 'z'
}
}
[/code]
给出一个字符串,判断是什么。比如,“1522124”,则是数字,CT_NUM,CT是charType的缩写。
getUnsigned函数,很明显,如果大于0,则是整体,输出,如果小于零,则屏蔽最高位,然后至1.
[quote]
justjavac 写道
给出一个字符串,判断是什么。比如,“1522124”,则是数字,CT_NUM,CT是charType的缩写。
getUnsigned函数,很明显,如果大于0,则是整体,输出,如果小于零,则屏蔽最高位,然后至1.
[code="java"]public static int getUnsigned(byte b) {
if (b > 0)
return (int) b;
else
return (b & 0x7F + 128);
} [/code]
还是不太明白这里。
为什么大于0.直接强行转换,而小于或等于0,即(b & 0x7F + 128);[/quote]
getUnsigned方法是返回一个byte值的无符号整数值,如果byte值大于0就是正数,正数就是无符号整型,其二进制表示是完全一样的,负数的二进制的最高为是1,所以用b和01111111(也就是0x7F)作位与运算把符号位变成0,但是由于最高位被丢失,所以另上128补上最高位。
假设b = -15
1111 0001 -15(补码表示)
0111 0001 位与结果(高位丢失)
1111 0001 相加结果
[quote]很谢谢您,能描述176、175、193、163等数字表示什么意思吗 [/quote]
参考ascii表
学习中,作个记录,以备查,谢谢