哪位能解析一下这段代码

[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 1111 0x7F

0111 0001 位与结果(高位丢失)

1000 0000 128

1111 0001 相加结果

[quote]很谢谢您,能描述176、175、193、163等数字表示什么意思吗 [/quote]
参考ascii表

学习中,作个记录,以备查,谢谢