一、前言
关于jsr082.jar源码包中javax.bluetooth.UUID定义全局序列生成器,详情参见源码说明。
二、源码说明
![]() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | package javax.bluetooth; public class UUID { long highBits; long lowBits; private static final long BASE_UUID_HIGHT = 4096L; private static final long BASE_UUID_LOW = -9223371485494954757L; private static final char [] digits = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' }; public UUID( long uuidValue) { if ((uuidValue < 0L) || (uuidValue > 4294967295L)) { throw new IllegalArgumentException( "The 'uuidValue' is out of [0, 2^32 - 1] range: " + uuidValue); } this .highBits = (uuidValue << 32 | 0x1000 ); this .lowBits = -9223371485494954757L; } public UUID(String uuidValue, boolean shortUUID) { if (uuidValue == null ) { throw new NullPointerException( "Specified 'uuidValue' is null" ); } if ((uuidValue.length() == 0 ) || ((shortUUID) && (uuidValue.length() > 8 )) || (uuidValue.length() > 32 )) { throw new IllegalArgumentException( "Invalid length of specified 'uuidValue': " + uuidValue.length()); } if (uuidValue.indexOf( 45 ) != - 1 ) { throw new NumberFormatException( "The '-' character is not allowed: " + uuidValue); } if (shortUUID) { long val = Long.parseLong(uuidValue, 16 ); this .highBits = (val << 32 | 0x1000 ); this .lowBits = -9223371485494954757L; return ; } this .highBits = 0L; if (uuidValue.length() < 16 ) { this .lowBits = Long.parseLong(uuidValue, 16 ); return ; } int l = uuidValue.length(); this .lowBits = Long.parseLong(uuidValue.substring(l - 8 ), 16 ); this .lowBits |= Long.parseLong(uuidValue.substring(l - 16 , l - 8 ), 16 ) << 32 ; if (l == 16 ) { return ; } if (l <= 24 ) { this .highBits = Long.parseLong(uuidValue.substring( 0 , l - 16 ), 16 ); } else { this .highBits = Long.parseLong(uuidValue.substring(l - 24 , l - 16 ), 16 ); this .highBits |= Long.parseLong(uuidValue.substring( 0 , l - 24 ), 16 ) << 32 ; } } public String toString() { int [] ints = { ( int )( this .lowBits & 0xFFFFFFFF ), ( int )( this .lowBits >>> 32 & 0xFFFFFFFF ), ( int )( this .highBits & 0xFFFFFFFF ), ( int )( this .highBits >>> 32 & 0xFFFFFFFF ) }; int charPos = 32 ; char [] buf = new char [charPos]; int shift = 4 ; int radix = 16 ; int mask = 15 ; int needZerosIndex = - 1 ; for ( int i = 3 ; i >= 0 ; --i) { if (ints[i] != 0 ) { needZerosIndex = i - 1 ; break ; } } for (i = 0 ; i < ints.length; ++i) { int j; if ((ints[i] == 0 ) && (needZerosIndex < i) && (i != 0 )) { break label226: } if (needZerosIndex >= i) { for (j = 0 ; j < 8 ; ++j) { buf[(--charPos)] = digits[(ints[i] & mask)]; ints[i] >>>= shift; } } else do { buf[(--charPos)] = digits[(ints[i] & mask)]; ints[i] >>>= shift; } while (ints[i] != 0 ); } label226: return new String(buf, charPos, 32 - charPos); } public boolean equals(Object value) { return ((value instanceof UUID) && ( this .lowBits == ((UUID)value).lowBits) && ( this .highBits == ((UUID)value).highBits)); } public int hashCode() { return ( int )( this .highBits ^ this .highBits >> 32 ^ this .lowBits ^ this .lowBits >> 32 ); } } |