diff --git a/PomeloClient-WebSocket/FirstViewController.m b/PomeloClient-WebSocket/FirstViewController.m index b31e919..b240df7 100644 --- a/PomeloClient-WebSocket/FirstViewController.m +++ b/PomeloClient-WebSocket/FirstViewController.m @@ -56,8 +56,8 @@ - (void)viewDidLoad { for (int i = 0; i< loop; i++) { double val = ((double)arc4random() / ARC4RANDOM_MAX); uint64_t number = (uint64_t)(val * limit); - NSMutableData* data = [PBCodec encodeUInt64:number]; - uint64_t result = [PBCodec decodeUInt64:data]; + NSMutableData* data = [PBCodec encodeUInt32:number]; + uint64_t result = [PBCodec decodeUInt32:data]; NSLog(@"dat: %@ => src: %llu => dst: %llu", data, number, result); assert(number == result); } @@ -70,8 +70,8 @@ - (void)viewDidLoad { double val = ((double)arc4random() / ARC4RANDOM_MAX); int64_t number = (int64_t)(val * limit) * flag; - NSMutableData* data = [PBCodec encodeSInt64:number]; - int64_t result = [PBCodec decodeSInt64:data]; + NSMutableData* data = [PBCodec encodeSInt32:number]; + int64_t result = [PBCodec decodeSInt32:data]; NSLog(@"dat: %@ => src: %lld => dst: %lld", data, number, result); assert(number == result); } diff --git a/PomeloClientWS/Protobuf/PBCodec.h b/PomeloClientWS/Protobuf/PBCodec.h index 538ea34..83075fd 100644 --- a/PomeloClientWS/Protobuf/PBCodec.h +++ b/PomeloClientWS/Protobuf/PBCodec.h @@ -20,14 +20,14 @@ #define JSON_parse(string) [NSJSONSerialization JSONObjectWithData:([string dataUsingEncoding:NSUTF8StringEncoding]) options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:nil] typedef enum { - PBT_Unknown = -1, - PBT_UInt32 = 0, - PBT_SInt32 = 0, - PBT_Int32 = 0, - PBT_Double = 1, - PBT_String = 2, - PBT_Message = 2, - PBT_Float = 5 + PBT_Unknown = -1, + PBT_UInt32 = 0, + PBT_SInt32 = 0, + PBT_Int32 = 0, + PBT_Double = 1, + PBT_String = 2, + PBT_Message = 2, + PBT_Float = 5 } ProtoBufType; //inline void translatePBTypeFromType(ProtoBufType type, NSMutableString *str) { @@ -57,30 +57,30 @@ typedef enum { /** * unsigned long */ -+ (NSMutableData *)encodeUInt32:(uint32_t)n; ++ (NSMutableData *)encodeUInt32:(uint64_t)n; -+ (uint32_t)decodeUInt32:(NSData *)data; ++ (uint64_t)decodeUInt32:(NSData *)data; /** * signed long */ -+ (NSMutableData *)encodeSInt32:(int32_t)n; ++ (NSMutableData *)encodeSInt32:(int64_t)n; -+ (int32_t)decodeSInt32:(NSData *)data; ++ (int64_t)decodeSInt32:(NSData *)data; -/** - * unsigned long long - */ -+ (NSMutableData *)encodeUInt64:(uint64_t)n; - -+ (uint64_t)decodeUInt64:(NSData *)data; - -/** - * signed long long - */ -+ (NSMutableData *)encodeSInt64:(int64_t)n; - -+ (int64_t)decodeSInt64:(NSData *)data; +///** +// * unsigned long long +// */ +//+ (NSMutableData *)encodeUInt64:(uint64_t)n; +// +//+ (uint64_t)decodeUInt64:(NSData *)data; +// +///** +// * signed long long +// */ +//+ (NSMutableData *)encodeSInt64:(int64_t)n; +// +//+ (int64_t)decodeSInt64:(NSData *)data; /** * float diff --git a/PomeloClientWS/Protobuf/PBCodec.m b/PomeloClientWS/Protobuf/PBCodec.m index 0740e87..4e291ce 100644 --- a/PomeloClientWS/Protobuf/PBCodec.m +++ b/PomeloClientWS/Protobuf/PBCodec.m @@ -10,222 +10,174 @@ @implementation PBCodec -/** - * codec UInt32 - */ -+ (NSMutableData *)encodeUInt32:(uint32_t)n { - return [PBCodec encodeUInt64:n]; -// unsigned char result[5] = {0}, count = 0; -// do { -// result[count++] = (unsigned char) ((n & 0x7F) | 0x80); -// n >>= 7; -// } while (n != 0); -// result[count - 1] &= 0x7F; -// return [NSMutableData dataWithBytes:result length:count]; -// //log("encodeUInt32: 0x%@", dst); -} - -+ (uint32_t)decodeUInt32:(NSData *)data { - return [PBCodec decodeUInt64:data]; -// uint32_t n = 0; -// unsigned char *ptr = (unsigned char *) data.bytes; -// uint32_t i = 0; -// for (; i < data.length; i++) { -// n |= ((ptr[i] & 0x7F) << (i * 7)); -// } -// //log("decodeUInt32: %u", n); -// return n; -} - -/** - * codec Int32 - */ -+ (NSMutableData *)encodeSInt32:(int32_t)n { - return [PBCodec encodeSInt64:n]; -// n = n < 0 ? (abs(n) * 2 - 1) : n * 2; -// return [PBCodec encodeUInt32:n]; -// //log("encodeSInt32: %@", dst); -} - -+ (int32_t)decodeSInt32:(NSData *)data { - return [PBCodec decodeSInt64:data]; -// // even number means source number is >= 0 -// // odd number means source number is < 0 -// uint32_t n = [PBCodec decodeUInt32:data]; -// bool isOddNumber = (bool) (n & 0x1); -// n >>= 1; -// //log("decodeSInt32: %d", ( (isOddNumber) ? (-1 * (n + 1)) : (n) )); -// return ((isOddNumber) ? (-1 * (n + 1)) : (n)); -} - /** * codec UInt64 */ -+ (NSMutableData *)encodeUInt64:(uint64_t)n { - unsigned char result[10] = {0}, count = 0; - - do { - result[count++] = (unsigned char) ((n & 0x7F) | 0x80); - n >>= 7; - } while (n != 0); - result[count - 1] &= 0x7F; - return [NSMutableData dataWithBytes:result length:count]; - - //log("encodeUInt64: 0x%@", dst); - -/*** - * the original javascript impl - */ -// do{ -// uint tmp = n % 128; -// uint64_t next = floor(n / 128); -// -// if(next != 0){ -// tmp = tmp + 128; -// } -// result[count++] = tmp; -// n = next; -// }while(n != 0); -// -// return [NSMutableData dataWithBytes:result length:count]; -/*** - * end original js impl - */ ++ (NSMutableData *)encodeUInt32:(uint64_t)n { + unsigned char result[10] = {0}, count = 0; + + do { + result[count++] = (unsigned char) ((n & 0x7F) | 0x80); + n >>= 7; + } while (n != 0); + result[count - 1] &= 0x7F; + return [NSMutableData dataWithBytes:result length:count]; + + //log("encodeUInt64: 0x%@", dst); + + /*** + * the original javascript impl + */ + // do{ + // uint tmp = n % 128; + // uint64_t next = floor(n / 128); + // + // if(next != 0){ + // tmp = tmp + 128; + // } + // result[count++] = tmp; + // n = next; + // }while(n != 0); + // + // return [NSMutableData dataWithBytes:result length:count]; + /*** + * end original js impl + */ } -+ (uint64_t)decodeUInt64:(NSData *)data { - uint64_t x = 0; //, n = 0; - unsigned char *ptr = (unsigned char *) data.bytes; - uint64_t i = 0; - - /*** - * the original javascript impl - */ - for (; i < data.length; i++) { - unsigned int m = ptr[i]; - // n |= ((m & 0x7F) << (i == 0? 1 : (i * 7))); - x += ((m & 0x7F) * pow(2, i*7) ); - if (m < 128) { - return x; - } - } - /*** - * end original js impl - */ - - /** - * our impl - */ -// for (; i < data.length; i++) { -// n += ((ptr[i] * (int)pow((double)2, (double)(i*7)))); -// if (ptr[i] < 128) { -// return n; -// } -// } - /** - * end our impl - */ - - //log("decodeUInt64: %u", n); - return x; ++ (uint64_t)decodeUInt32:(NSData *)data { + uint64_t x = 0; //, n = 0; + unsigned char *ptr = (unsigned char *) data.bytes; + uint64_t i = 0; + + /*** + * the original javascript impl + */ + for (; i < data.length; i++) { + unsigned int m = ptr[i]; + // n |= ((m & 0x7F) << (i == 0? 1 : (i * 7))); + x += ((m & 0x7F) * pow(2, i*7) ); + if (m < 128) { + return x; + } + } + /*** + * end original js impl + */ + + /** + * our impl + */ + // for (; i < data.length; i++) { + // n += ((ptr[i] * (int)pow((double)2, (double)(i*7)))); + // if (ptr[i] < 128) { + // return n; + // } + // } + /** + * end our impl + */ + + //log("decodeUInt64: %u", n); + return x; } /** * codec Int64 */ -+ (NSMutableData *)encodeSInt64:(int64_t)n { - n = n < 0 ? ((llabs(n) * 2) - 1) : n * 2; - return [PBCodec encodeUInt64:n]; - //log("encodeSInt64: %@", dst); ++ (NSMutableData *)encodeSInt32:(int64_t)n { + n = n < 0 ? ((llabs(n) * 2) - 1) : n * 2; + return [PBCodec encodeUInt32:n]; + //log("encodeSInt64: %@", dst); } -+ (int64_t)decodeSInt64:(NSData *)data { - // even number means source number is >= 0 - // odd number means source number is < 0 - uint64_t n = [PBCodec decodeUInt64:data]; - bool isOddNumber = (bool) (n & 0x1); - n >>= 1; - //log("decodeSInt64: %d", ( (isOddNumber) ? (-1 * (n + 1)) : (n) )); - return ((isOddNumber) ? (-1 * (n + 1)) : (n)); ++ (int64_t)decodeSInt32:(NSData *)data { + // even number means source number is >= 0 + // odd number means source number is < 0 + uint64_t n = [PBCodec decodeUInt32:data]; + bool isOddNumber = (bool) (n & 0x1); + n >>= 1; + //log("decodeSInt64: %d", ( (isOddNumber) ? (-1 * (n + 1)) : (n) )); + return ((isOddNumber) ? (-1 * (n + 1)) : (n)); } /** * codec Float */ + (NSMutableData *)encodeFloat:(float)n { - union u { - float f; - int32_t i; - }; - union u tmp; - tmp.f = n; - return [NSMutableData dataWithBytes:&(tmp.i) length:sizeof(float)]; - //log("encodeFloat: %@", dst); + union u { + float f; + int32_t i; + }; + union u tmp; + tmp.f = n; + return [NSMutableData dataWithBytes:&(tmp.i) length:sizeof(float)]; + //log("encodeFloat: %@", dst); } + (float)decodeFloat:(NSData *)data from:(NSUInteger)offset { - if (data == nil || data.length < (offset + sizeof(float))) { - return 0.0; - } - - union u { - float f; - int32_t i; - }; - union u tmp; - tmp.i = *(int32_t *) &(data.bytes[offset]); - //log("decodeFloat: %f", tmp.f); - return tmp.f; + if (data == nil || data.length < (offset + sizeof(float))) { + return 0.0; + } + + union u { + float f; + int32_t i; + }; + union u tmp; + tmp.i = *(int32_t *) &(data.bytes[offset]); + //log("decodeFloat: %f", tmp.f); + return tmp.f; } /** * codec double */ + (NSMutableData *)encodeDouble:(double)n { - union u { - double d; - int64_t i; - }; - union u tmp; - tmp.d = n; - return [NSMutableData dataWithBytes:&(tmp.i) length:sizeof(double)]; - //log("encodeDouble: %@", dst); + union u { + double d; + int64_t i; + }; + union u tmp; + tmp.d = n; + return [NSMutableData dataWithBytes:&(tmp.i) length:sizeof(double)]; + //log("encodeDouble: %@", dst); } + (double)decodeDouble:(NSData *)data from:(NSUInteger)offset { - if (data == nil || data.length < (offset + sizeof(double))) { - return 0.0; - } - union u { - double d; - int64_t i; - }; - union u tmp; - tmp.i = *(int64_t *) &(data.bytes[offset]); - //log("decodeDouble: %lf", tmp.d); - return tmp.d; + if (data == nil || data.length < (offset + sizeof(double))) { + return 0.0; + } + union u { + double d; + int64_t i; + }; + union u tmp; + tmp.i = *(int64_t *) &(data.bytes[offset]); + //log("decodeDouble: %lf", tmp.d); + return tmp.d; } /** * codec String */ + (NSUInteger)encodeStr:(NSString *)str dst:(NSMutableData *)dst from:(NSUInteger)offset { - NSData *strAsData = [str dataUsingEncoding:NSUTF8StringEncoding]; - [dst replaceBytesInRange:NSMakeRange(offset, [str length]) - withBytes:strAsData.bytes - length:[str length]]; - return (offset + [strAsData length]); -// [dst setData:[str dataUsingEncoding:NSUTF8StringEncoding]]; - //log("encodeStr: %@", dst); + NSData *strAsData = [str dataUsingEncoding:NSUTF8StringEncoding]; + [dst replaceBytesInRange:NSMakeRange(offset, [str length]) + withBytes:strAsData.bytes + length:[str length]]; + return (offset + [strAsData length]); + // [dst setData:[str dataUsingEncoding:NSUTF8StringEncoding]]; + //log("encodeStr: %@", dst); } + (NSMutableString *)decodeStr:(NSData *)data from:(NSUInteger)offset withLength:(NSUInteger)length { - return [[NSMutableString alloc] initWithData:[data subdataWithRange:NSMakeRange(offset, length)] encoding:NSUTF8StringEncoding]; - //log("decodeStr: %@", dst); + return [[NSMutableString alloc] initWithData:[data subdataWithRange:NSMakeRange(offset, length)] encoding:NSUTF8StringEncoding]; + //log("decodeStr: %@", dst); } + (unsigned long)byteLength:(NSString *)str { - return [[str dataUsingEncoding:NSUTF8StringEncoding] length]; + return [[str dataUsingEncoding:NSUTF8StringEncoding] length]; } @end diff --git a/PomeloClientWS/Protobuf/PBDecoder.m b/PomeloClientWS/Protobuf/PBDecoder.m index edd167a..c535a0d 100644 --- a/PomeloClientWS/Protobuf/PBDecoder.m +++ b/PomeloClientWS/Protobuf/PBDecoder.m @@ -17,7 +17,7 @@ static NSUInteger _offset = 0; @interface PBDecoder ( -private) + private) + (NSMutableDictionary *)decodeMsg:(NSMutableDictionary *)msg withProtos:(NSDictionary *)protos length:(NSUInteger)length; @@ -38,18 +38,18 @@ + (void)peekBytesToBuffer:(NSMutableData *)dest; @end @implementation PBDecoder { -// NSDictionary *_protos; -// NSMutableData *_buffer; -// NSUInteger _offset; + // NSDictionary *_protos; + // NSMutableData *_buffer; + // NSUInteger _offset; } + (void)initialize { -// if (_privateDecoder == nil) { -//// _privateDecoder = [[PBDecoder alloc] init]; -// log("private encoder initialized."); -// } - _offset = 0; - _buffer = [NSMutableData data]; + // if (_privateDecoder == nil) { + //// _privateDecoder = [[PBDecoder alloc] init]; + // log("private encoder initialized."); + // } + _offset = 0; + _buffer = [NSMutableData data]; } //- (void)setProtos:(NSDictionary *)protos { @@ -78,191 +78,196 @@ + (void)initialize { //} + (void)protosInit:(NSDictionary *)protos { - _protos = protos; + _protos = protos; } + (NSDictionary *)protos { - return _protos; + return _protos; } + (void)setOffset:(NSUInteger)n { - _offset = n; + _offset = n; } + (NSUInteger)offset { - return _offset; + return _offset; } + (void)setBuffer:(NSData *)data { - [_buffer setData:data]; + [_buffer setData:data]; } + (NSMutableData *)buffer { - return _buffer; + return _buffer; } #pragma mark - decode + (NSMutableDictionary *)decodeMsgWithRoute:(NSString *)route andData:(NSData *)data { - - NSMutableDictionary *msg = [NSMutableDictionary dictionary]; - - NSDictionary *protos = [[PBDecoder protos] objectForKey:route]; - - [PBDecoder setBuffer:data]; - [PBDecoder setOffset:0]; - - if (protos != nil && [protos count] > 0) { - return [PBDecoder decodeMsg:msg withProtos:protos length:[PBDecoder buffer].length]; - } - - return [NSMutableDictionary dictionary]; + + NSMutableDictionary *msg = [NSMutableDictionary dictionary]; + + NSDictionary *protos = [[PBDecoder protos] objectForKey:route]; + + [PBDecoder setBuffer:data]; + [PBDecoder setOffset:0]; + + if (protos != nil && [protos count] > 0) { + return [PBDecoder decodeMsg:msg withProtos:protos length:[PBDecoder buffer].length]; + } + + return [NSMutableDictionary dictionary]; } @end #pragma mark - private methods @implementation PBDecoder ( -private) + private) + (NSMutableDictionary *)decodeMsg:(NSMutableDictionary *)msg withProtos:(NSDictionary *)protos length:(NSUInteger)length { - while ([PBDecoder offset] < length) { - PBHead head = [PBDecoder getHead]; - NSString *name = [[protos objectForKey:@"__tags"] objectForKey:[NSString stringWithFormat:@"%u", head.tag]]; - NSString *protosNameOption = [[protos objectForKey:name] objectForKey:@"option"]; - - if ([protosNameOption isEqualToString:@"optional"] || [protosNameOption isEqualToString:@"required"]) { - // msg[name] = decodeProp(protos[name].type, protos); - [msg setObject:[PBDecoder decodeProp:[[protos objectForKey:name] objectForKey:@"type"] withProtos:protos] forKey:name]; - } else if ([protosNameOption isEqualToString:@"repeated"]) { - id msgName = [msg objectForKey:name]; - if (msgName == nil || ![msgName isKindOfClass:[NSMutableArray class]]) { - msgName = [NSMutableArray array]; - [msg setObject:msgName forKey:name]; - } - [PBDecoder decodeArray:msgName withTypeStr:[[protos objectForKey:name] objectForKey:@"type"] andProtos:protos]; - } - } - - return msg; + while ([PBDecoder offset] < length) { + PBHead head = [PBDecoder getHead]; + NSString *name = [[protos objectForKey:@"__tags"] objectForKey:[NSString stringWithFormat:@"%u", head.tag]]; + NSString *protosNameOption = [[protos objectForKey:name] objectForKey:@"option"]; + + if ([protosNameOption isEqualToString:@"optional"] || [protosNameOption isEqualToString:@"required"]) { + // msg[name] = decodeProp(protos[name].type, protos); + [msg setObject:[PBDecoder decodeProp:[[protos objectForKey:name] objectForKey:@"type"] withProtos:protos] forKey:name]; + } else if ([protosNameOption isEqualToString:@"repeated"]) { + id msgName = [msg objectForKey:name]; + if (msgName == nil || ![msgName isKindOfClass:[NSMutableArray class]]) { + msgName = [NSMutableArray array]; + [msg setObject:msgName forKey:name]; + } + [PBDecoder decodeArray:msgName withTypeStr:[[protos objectForKey:name] objectForKey:@"type"] andProtos:protos]; + } + } + + return msg; } + (id)decodeProp:(NSString *)typeStr withProtos:(NSDictionary *)protos { - - NSMutableData *_local_buffer_ = [NSMutableData data]; - - if ([typeStr isEqualToString:@"uInt32"]) { - [PBDecoder getBytes:NO toBuffer:_local_buffer_]; - unsigned int ui = [PBCodec decodeUInt32:_local_buffer_]; - return [NSNumber numberWithUnsignedInt:ui]; - } else if ([typeStr isEqualToString:@"int32"] || [typeStr isEqualToString:@"sInt32"]) { - [PBDecoder getBytes:NO toBuffer:_local_buffer_]; - signed int si = [PBCodec decodeSInt32:_local_buffer_]; - return [NSNumber numberWithInt:si]; - } else if ([typeStr isEqualToString:@"float"]) { - float flt = [PBCodec decodeFloat:[PBDecoder buffer] from:[PBDecoder offset]]; - [PBDecoder setOffset:([PBDecoder offset] + 4)]; - return [NSNumber numberWithFloat:flt]; - } else if ([typeStr isEqualToString:@"double"]) { - double dbl = [PBCodec decodeDouble:[PBDecoder buffer] from:[PBDecoder offset]]; - [PBDecoder setOffset:([PBDecoder offset] + 8)]; - return [NSNumber numberWithDouble:dbl]; - } else if ([typeStr isEqualToString:@"string"]) { - [PBDecoder getBytes:NO toBuffer:_local_buffer_]; - NSUInteger length = [PBCodec decodeUInt32:_local_buffer_]; - - NSMutableString *str = [PBCodec decodeStr:[PBDecoder buffer] from:[PBDecoder offset] withLength:length]; - [PBDecoder setOffset:([PBDecoder offset] + length)]; - return str; - } else { - NSDictionary *privateProtosMsg = [protos objectForKey:@"__messages"]; - NSDictionary *privateProtosMsgType = [privateProtosMsg objectForKey:typeStr]; - if (protos != nil && privateProtosMsgType != nil) { - [PBDecoder getBytes:NO toBuffer:_local_buffer_]; - NSUInteger length = [PBCodec decodeUInt32:_local_buffer_]; - NSMutableDictionary *msg = [NSMutableDictionary dictionary]; - [PBDecoder decodeMsg:msg withProtos:privateProtosMsgType length:(length + [PBDecoder offset])]; - return msg; - } - } - return nil; + + NSMutableData *_local_buffer_ = [NSMutableData data]; + + if ([typeStr isEqualToString:@"uInt32"]) { + [PBDecoder getBytes:NO toBuffer:_local_buffer_]; + uint64_t ui = [PBCodec decodeUInt32:_local_buffer_]; + return [NSNumber numberWithUnsignedLongLong:ui]; + // return [NSNumber numberWithUnsignedInt:ui]; + } else if ([typeStr isEqualToString:@"int32"] || [typeStr isEqualToString:@"sInt32"]) { + [PBDecoder getBytes:NO toBuffer:_local_buffer_]; + int64_t si = [PBCodec decodeSInt32:_local_buffer_]; + return [NSNumber numberWithLongLong:si]; + // return [NSNumber numberWithInt:si]; + } else if ([typeStr isEqualToString:@"float"]) { + float flt = [PBCodec decodeFloat:[PBDecoder buffer] from:[PBDecoder offset]]; + [PBDecoder setOffset:([PBDecoder offset] + 4)]; + return [NSNumber numberWithFloat:flt]; + } else if ([typeStr isEqualToString:@"double"]) { + double dbl = [PBCodec decodeDouble:[PBDecoder buffer] from:[PBDecoder offset]]; + [PBDecoder setOffset:([PBDecoder offset] + 8)]; + return [NSNumber numberWithDouble:dbl]; + } else if ([typeStr isEqualToString:@"string"]) { + [PBDecoder getBytes:NO toBuffer:_local_buffer_]; + NSUInteger length = (NSUInteger)[PBCodec decodeUInt32:_local_buffer_]; + + NSMutableString *str = [PBCodec decodeStr:[PBDecoder buffer] from:[PBDecoder offset] withLength:length]; + [PBDecoder setOffset:([PBDecoder offset] + length)]; + return str; + } else { + NSDictionary *privateProtosMsg = [protos objectForKey:@"__messages"]; + NSDictionary *privateProtosMsgType = [privateProtosMsg objectForKey:typeStr]; + if (privateProtosMsgType == nil) { + privateProtosMsgType = [[PBDecoder protos] objectForKey:[NSString stringWithFormat:@"message %@", typeStr]]; + } + if (protos != nil && privateProtosMsgType != nil) { + [PBDecoder getBytes:NO toBuffer:_local_buffer_]; + NSUInteger length = (NSUInteger)[PBCodec decodeUInt32:_local_buffer_]; + NSMutableDictionary *msg = [NSMutableDictionary dictionary]; + [PBDecoder decodeMsg:msg withProtos:privateProtosMsgType length:(length + [PBDecoder offset])]; + return msg; + } + } + return nil; } // what is this for ? + (BOOL)isFinish:(NSDictionary *)msg withProtos:(NSDictionary *)protos { - PBHead head = [PBDecoder getHead]; - NSDictionary *privateProtosTags = [protos objectForKey:@"__tags"]; - return (nil == [privateProtosTags objectForKey:[NSString stringWithFormat:@"%u", head.tag]]); - // return (!protos.__tags[peekHead().tag]); + PBHead head = [PBDecoder getHead]; + NSDictionary *privateProtosTags = [protos objectForKey:@"__tags"]; + return (nil == [privateProtosTags objectForKey:[NSString stringWithFormat:@"%u", head.tag]]); + // return (!protos.__tags[peekHead().tag]); } + (PBHead)getHead { - NSMutableData *_local_buffer_ = [NSMutableData dataWithLength:4]; - - [PBDecoder getBytes:NO toBuffer:_local_buffer_]; - NSUInteger tag = [PBCodec decodeUInt32:_local_buffer_]; - - PBHead head; - head.type = (NSUInteger) tag & 0x07; - head.tag = (NSUInteger) tag >> 3; - - return head; + NSMutableData *_local_buffer_ = [NSMutableData dataWithLength:4]; + + [PBDecoder getBytes:NO toBuffer:_local_buffer_]; + NSUInteger tag = (NSUInteger)[PBCodec decodeUInt32:_local_buffer_]; + + PBHead head; + head.type = (NSUInteger) tag & 0x07; + head.tag = (NSUInteger) tag >> 3; + + return head; } + (PBHead)peekHead { - NSMutableData *_local_buffer_ = [NSMutableData dataWithLength:4]; - - [PBDecoder peekBytesToBuffer:_local_buffer_]; - NSUInteger tag = [PBCodec decodeUInt32:_local_buffer_]; - - PBHead head; - head.type = (NSUInteger) tag & 0x07; - head.tag = (NSUInteger) tag >> 3; - - return head; + NSMutableData *_local_buffer_ = [NSMutableData dataWithLength:4]; + + [PBDecoder peekBytesToBuffer:_local_buffer_]; + NSUInteger tag = (NSUInteger)[PBCodec decodeUInt32:_local_buffer_]; + + PBHead head; + head.type = (NSUInteger) tag & 0x07; + head.tag = (NSUInteger) tag >> 3; + + return head; } + (void)decodeArray:(NSMutableArray *)array withTypeStr:(NSString *)typeStr andProtos:(NSDictionary *)protos { - NSMutableData *_local_buffer_ = [NSMutableData data]; - if ([PBHelper isSimpleType:[PBHelper translatePBTypeFromStr:typeStr]]) { - [PBDecoder getBytes:NO toBuffer:_local_buffer_]; - NSUInteger length = [PBCodec decodeUInt32:_local_buffer_]; - NSUInteger i = 0; - for (; i < length; i++) { - [array addObject:[PBDecoder decodeProp:typeStr withProtos:nil]]; - } - } else { - [array addObject:[PBDecoder decodeProp:typeStr withProtos:protos]]; - } + NSMutableData *_local_buffer_ = [NSMutableData data]; + if ([PBHelper isSimpleType:[PBHelper translatePBTypeFromStr:typeStr]]) { + [PBDecoder getBytes:NO toBuffer:_local_buffer_]; + NSUInteger length = (NSUInteger)[PBCodec decodeUInt32:_local_buffer_]; + NSUInteger i = 0; + for (; i < length; i++) { + [array addObject:[PBDecoder decodeProp:typeStr withProtos:nil]]; + } + } else { + [array addObject:[PBDecoder decodeProp:typeStr withProtos:protos]]; + } } + (void)getBytes:(BOOL)flag toBuffer:(NSMutableData *)dest { - if (dest == nil) { - dest = [NSMutableData data]; - } - NSUInteger pos = [PBDecoder offset]; - NSUInteger count = 0; - unsigned char c = 0; - - unsigned char *buff = (unsigned char *) [PBDecoder buffer].bytes; - unsigned char *_dst = malloc([PBDecoder buffer].length); - - do { - c = buff[pos++]; - _dst[count++] = c; - } while (c >= 128); - - if (NO == flag) { - [PBDecoder setOffset:pos]; - } - - NSData *tmpData = [NSData dataWithBytes:_dst length:count]; - [dest setData:tmpData]; - - free(_dst); + if (dest == nil) { + dest = [NSMutableData data]; + } + NSUInteger pos = [PBDecoder offset]; + NSUInteger count = 0; + unsigned char c = 0; + + unsigned char *buff = (unsigned char *) [PBDecoder buffer].bytes; + unsigned char *_dst = malloc([PBDecoder buffer].length); + + do { + c = buff[pos++]; + _dst[count++] = c; + } while (c >= 128); + + if (NO == flag) { + [PBDecoder setOffset:pos]; + } + + NSData *tmpData = [NSData dataWithBytes:_dst length:count]; + [dest setData:tmpData]; + + free(_dst); } + (void)peekBytesToBuffer:(NSMutableData *)dest { - [PBDecoder getBytes:YES toBuffer:dest]; + [PBDecoder getBytes:YES toBuffer:dest]; }