网游服务器框架(2)Stream

本文详细介绍了FSOutputStream类的实现,该类用于高效地进行数据序列化和流操作,包括字节序处理、缓存区管理和多种类型的数据写入。
部署运行你感兴趣的模型镜像



为了方便序列化数据,特建立了InputStream  和 outStream 2种数据容器。

每个流在初始化的时候。都带有字节序属性, 在写入和读取的时候,先处理再返回,这样逻辑部分可以解决字节序等问题。

Output 在初始化的时候  建立一个固定大小的缓存区。 保持一个流指针。 每次写入新的数据,都copy数据到流指针处,然后指针向后偏移写入的大小


Input  同上。每次读取。都偏移指针位置。


#define DEFAULT_BUFFER_MAX 128

class FSOutputStream
{

private:

	FS_DEFINE_READ_ONLY(size_t, m_iBufferLength, BufferLength);
	FS_DEFINE_READ_ONLY(size_t, m_iPos, Pos);
	FS_DEFINE_READ_ONLY(void*, m_pData, Data);

private:
	void scaleBuffer();

public:
	
	FSOutputStream(size_t length=DEFAULT_BUFFER_MAX);
	virtual ~FSOutputStream(){
		if(m_pData){
			free(m_pData);
			m_pData = NULL;
		}
	}

public:
	
	void toBytes(void*);

	size_t getLength(){ return m_iPos; };

	void subBuffer(size_t start, size_t len);

	void writeLongLong(unsigned long long);
	void writeInt(int val);
	void writeLong(long val);
	void writeShort(short val);


	void writeUInt(unsigned int);
	void writeUShort(unsigned short);


	void writeFloat(float val);
	void writeByte(BYTE val);
	void writeDatas(const void*, size_t);
	void writeString(char*, int);
	void writeString(const char*);
	void writeString(std::string str){  writeString((char*)str.c_str(), str.length()); };

};


#include "FSOutputStream.h"


FSOutputStream::FSOutputStream(size_t length):m_iBufferLength(length), m_iPos(0), m_pData(malloc(length)){
}

void FSOutputStream::toBytes(void* out){
	memcpy(out, m_pData, getLength());
}

void FSOutputStream::scaleBuffer(){

	m_iBufferLength = m_iBufferLength << 1;
	void* newBuffer = ::malloc(m_iBufferLength);
	memcpy(newBuffer, m_pData, m_iPos);

	void* tmp = m_pData;
	m_pData = newBuffer;
	free(tmp);

}

void FSOutputStream::subBuffer(size_t start, size_t len){

	void* newBuffer = ::malloc(len == 0 ? DEFAULT_BUFFER_MAX : len);
	memcpy(newBuffer, (BYTE*)m_pData + start, len);

	m_iBufferLength = (len == 0 ? DEFAULT_BUFFER_MAX : len);

	free(m_pData);
	m_pData = newBuffer;

	m_iPos = len;

}
void FSOutputStream::writeString(const char* data){
	int len = strnlen(data, 65535);
	writeInt(len);
	writeDatas(data, len);
}

void FSOutputStream::writeString(char* data, int len){
	writeInt(len);
	writeDatas(data, len);
}
void FSOutputStream::writeInt(int val){
	writeDatas(&val, sizeof(int));
}

void FSOutputStream::writeLong(long val){
	
	writeDatas(&val, sizeof(long));
}


void FSOutputStream::writeLongLong(unsigned long long v){

	int height = v >> 32;
	int low = v & 0xffffffff;
	writeInt(height);
	writeInt(low);
}

void FSOutputStream::writeShort(short val){
	writeDatas(&val, sizeof(short));

}
void FSOutputStream::writeUInt(unsigned int val){
	writeDatas(&val, sizeof(unsigned int));
}
void FSOutputStream::writeUShort(unsigned short val){
	writeDatas(&val, sizeof(unsigned short));
}

void FSOutputStream::writeFloat(float val){
	writeDatas(&val, sizeof(float));
}

void FSOutputStream::writeByte(BYTE val){
	
	writeDatas(&val, sizeof(BYTE));
}

void FSOutputStream::writeDatas(const void* data, size_t len){

	while(m_iPos + len >= m_iBufferLength){
		scaleBuffer();
	}

	memcpy((BYTE*)m_pData + m_iPos, data, len);

	m_iPos += len;

}


您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值