static MessagePtr Parse(const char* buf, int len, ErrorCode* error) { MessagePtr message; typedef google::protobuf::int32 int32; // check sum int32 expectedCheckSum = async::detail::AsInt32(buf + len - kHeaderLen); int32 checkSum = static_cast<int32>(0 /*::adler32(1, reinterpret_cast<const Bytef*>(buf), static_cast<int>(len - kHeaderLen))*/); if (checkSum == expectedCheckSum) { // get message type name int32 nameLen = async::detail::AsInt32(buf); if (nameLen >= 2 && nameLen <= len - 2 * kHeaderLen) { std::string typeName(buf + kHeaderLen, buf + kHeaderLen + nameLen - 1); // create message object message.reset(CreateMessage(typeName)); if (message) { // parse from buffer const char* data = buf + kHeaderLen + nameLen; int32 dataLen = len - nameLen - 2 * kHeaderLen; if (message->ParseFromArray(data, dataLen)) { *error = kNoError; } else { *error = kParseError; } } else { *error = kUnknownMessageType; } } else { *error = kInvalidNameLen; } } else { *error = kCheckSumError; } return message; }
MessagePtr ProtobufCodec::parse(char *buf,int len) { MessagePtr message; int32_t nameLen = asInt32(buf); if(nameLen >=2 && nameLen <= len - kHeaderLen) { std::string typeName(buf + kHeaderLen,buf + kHeaderLen + nameLen -1); //创建消息对象 message.reset(createMessage(typeName)); if(message) { const char *data = buf + kHeaderLen + nameLen; int32_t dataLen = len - nameLen - 2*kHeaderLen; //从Buffer中获取完整的消息格式 if(message->ParseFromArray(data,dataLen)) { printf("解析消息成功\n"); } } } return message; }