std::shared_ptr<MyBuffer> ProtobufCodec::Encode(const CMessage& message) { std::shared_ptr<MyBuffer> ptrBuffer(new MyBuffer()); assert(0 == ptrBuffer->readableBytes()); const std::string& typeName = message.GetTypeName(); int32_t nameLen = static_cast<int32_t>(typeName.size() + 1);//'\0' ptrBuffer->appendUint32(nameLen); ptrBuffer->append(typeName.c_str(), nameLen); //消息内容 size_t byte_size = message.ByteSize(); //ensure memory enough ptrBuffer->ensureWritableBytes(byte_size); //write data message.SerializeWithCachedSizesToArray(reinterpret_cast<uint8_t*>(ptrBuffer->beginWrite())); ptrBuffer->commit(byte_size);//move write index //检验和 uint32_t checkSum = adler32(1, reinterpret_cast<const Bytef*>(ptrBuffer->peek()), ptrBuffer->readableBytes()); ptrBuffer->appendUint32(checkSum); assert(ptrBuffer->readableBytes() == sizeof(nameLen)+nameLen + byte_size + sizeof(checkSum)); //消息长度 int32_t len = htonl(static_cast<int32_t>(ptrBuffer->readableBytes())); ptrBuffer->prepend(&len, sizeof(len)); //delimiter ptrBuffer->append("\r\n", 2); return ptrBuffer; }