当前位置:网站首页>Analysis of tars source code 25
Analysis of tars source code 25
2022-07-21 17:15:00 【Tao song remains the same】
How to pack , After reading it, I understand :
#include "util/tc_pack.h"
#include <iostream>
#include <string.h>
namespace tars
{
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (bool t)
{
_buffer.append(sizeof(bool), (char)t);
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (char t)
{
_buffer.append(sizeof(char), (char)t);
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned char t)
{
(*this) << (char)t;
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (short t)
{
t = htons(t);
_buffer.append((const char *)&t, sizeof(t));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned short t)
{
(*this) << (short)t;
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (int t)
{
t = htonl(t);
_buffer.append((const char *)&t, sizeof(int));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned int t)
{
(*this) << (int)t;
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long t)
{
if(sizeof(long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
}
else
{
t = htonl(t);
}
_buffer.append((const char *)&t, sizeof(long));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long t)
{
if(sizeof(unsigned long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
}
else
{
t = htonl(t);
}
_buffer.append((const char *)&t, sizeof(unsigned long));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long long t)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
_buffer.append((const char *)&t, sizeof(long long));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long long t)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
_buffer.append((const char *)&t, sizeof(unsigned long long));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (float t)
{
_buffer.append((const char *)&t, sizeof(float));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (double t)
{
_buffer.append((const char *)&t, sizeof(double));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (const char *sBuffer)
{
_buffer.append(sBuffer, strlen(sBuffer) + 1);
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (const string& sBuffer)
{
uint32_t len = (uint32_t)sBuffer.length();
if(len < 255)
{
unsigned char c = (unsigned char)len;
(*this) << c;
}
else
{
unsigned char c = 255;
(*this) << c;
(*this) << len;
}
_buffer.append(sBuffer);
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (const TC_PackIn& pi)
{
_buffer.append(pi.topacket());
return (*this);
}
/************************************************************************/
bool TC_PackOut::isEnd()
{
if(_pos >= _length)
{
return true;
}
return false;
}
TC_PackOut& TC_PackOut::operator >> (bool &t)
{
size_t len = sizeof(bool);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read bool error.");
}
memcpy(&t, _pbuffer + _pos, len);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (char &t)
{
size_t len = sizeof(char);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read char error.");
}
memcpy(&t, _pbuffer + _pos, len);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (unsigned char &t)
{
size_t len = sizeof(unsigned char);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read unsigned char error.");
}
memcpy(&t, _pbuffer + _pos, len);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (short &t)
{
size_t len = sizeof(short);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read short error.");
}
memcpy(&t, _pbuffer + _pos, len);
t = ntohs(t);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (unsigned short &t)
{
size_t len = sizeof(unsigned short);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read unsigned short error.");
}
memcpy(&t, _pbuffer + _pos, len);
t = ntohs(t);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (int &t)
{
size_t len = sizeof(int);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read int error.");
}
memcpy(&t, _pbuffer + _pos, len);
t = ntohl(t);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (unsigned int &t)
{
size_t len = sizeof(unsigned int);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read unsigned int error.");
}
memcpy(&t, _pbuffer + _pos, len);
t = ntohl(t);
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (long &t)
{
size_t len = sizeof(long);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read long error.");
}
memcpy(&t, _pbuffer + _pos, len);
if(sizeof(unsigned long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
}
else
{
t = ntohl(t);
}
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (unsigned long &t)
{
size_t len = sizeof(unsigned long);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read long error.");
}
memcpy(&t, _pbuffer + _pos, len);
if(sizeof(unsigned long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
}
else
{
t = ntohl(t);
}
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (long long &t)
{
size_t len = sizeof(long long);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read long long error.");
}
memcpy(&t, _pbuffer + _pos, len);
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (unsigned long long &t)
{
size_t len = sizeof(unsigned long long);
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read long long error.");
}
memcpy(&t, _pbuffer + _pos, len);
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
_pos += len;
return *this;
}
TC_PackOut& TC_PackOut::operator >> (float &f)
{
if(_pos + sizeof(float) > _length)
{
throw TC_PackOut_Exception("TC_PackOut read float error.");
}
memcpy(&f, _pbuffer + _pos, sizeof(float));
_pos += sizeof(float);
return *this;
}
TC_PackOut& TC_PackOut::operator >> (double &f)
{
if(_pos + sizeof(double) > _length)
{
throw TC_PackOut_Exception("TC_PackOut read double error.");
}
memcpy(&f, _pbuffer + _pos, sizeof(double));
_pos += sizeof(double);
return *this;
}
TC_PackOut& TC_PackOut::operator >> (char *sBuffer)
{
strcpy(sBuffer, _pbuffer + _pos);
_pos += strlen(sBuffer) + 1;
if(_pos > _length)
{
throw TC_PackOut_Exception("TC_PackOut read zero string error.");
}
return *this;
}
TC_PackOut& TC_PackOut::operator >> (string& sBuffer)
{
uint32_t len = 0;
unsigned char c;
(*this) >> c;
if(c == 255)
{
(*this) >> len;
}
else
{
len = c;
}
if(_pos + len > _length)
{
throw TC_PackOut_Exception("TC_PackOut read string error.");
}
sBuffer.assign((const char*)(_pbuffer + _pos), len);
_pos += len;
return *this;
}
}
边栏推荐
- Self signed San certificate
- 第06篇:池化技术
- 【面试:并发篇19:多线程:Park&Unpark】
- ONEFLOW V0.8.0 officially released
- The top three suddenly changed, revealing the latest ranking of programming languages in July
- 王者荣耀商城异地多活架构设计(架构实战营 模块七作业)
- 554. Brick wall
- 12、用户微服务
- My SQL is OK. Why is it still so slow? MySQL locking rules
- Kubernetes Service 负载均衡实现机制
猜你喜欢
Multi active architecture design of wangzhe glory Mall (module 7 of architecture practice camp)
2018 USBASP burner general version tutorial
What is a video content recommendation engine?
进程的创建(创建原语,引起其发生的事件)
Four redis cluster schemes and their advantages and disadvantages
【无标题】今年值得关注的神书,豆瓣评分高达9.0分,京东当当有售
王者荣耀商城异地多活架构设计(架构实战营 模块七作业)
Network security module B of national vocational college skills competition "comprehensive penetration test of web security"
BCG attribute list
[solved] Splunk :Non-200/201 status_code=401; {“messages“:[{“type“:“WARN“,“text“:“call not properly
随机推荐
[interview: concurrent Article 19: multithreading: Park & unpark]
今年,熬下去,才有盼头
【面試:並發篇19:多線程:Park&Unpark】
1720. Array after XOR decoding
进程控制块(PCB) 包含哪些信息
项目经理如何做好“老板”项目
How kubelet works
主成分分析及SPSS的使用------笔记
tars源码分析之21
Kube controller manager principle
How to do well in test management?
This PIP uses a cheat sheet, how complete it must be!
938. Range and of binary search tree
让实习生搭个Redis集群,差点把我”搭“进去~~~
vscode setting.json
tars源码分析之24
1011. Ability to deliver packages within D days
GAMES101图形学P12笔记(geometry3)
Codeforces Round #808 (Div. 2)
redis集群安装