c++bytebuffer留着用,要不每次要写或者找
来源:互联网 发布:pc手机微信三合一源码 编辑:程序博客网 时间:2024/05/01 17:59
头文件
#ifndef __MK_BYTE_BUFFER_H__#define __MK_BYTE_BUFFER_H__#include <iostream>const int endian = 1;#define is_bigendian() ((*(char*) &endian) == 0)#define is_littlendbian() ((*(char*) &endian) == 1)// size of data 1M#define BUFF_SIZE_MAX 1024 * 1024namespace MK{ template<typename T> T ConvertDigitToNet(T v); template<typename T> T ConvertNetToDigit(T v); class ByteBuffer { private: char *m_cBuffer; size_t m_rpos; size_t m_wpos; size_t m_nSize; public: explicit ByteBuffer(size_t size = 0):m_rpos(0), m_wpos(0), m_nSize(size) { size_t nSize = size <= 0 ? BUFF_SIZE_MAX:size; m_cBuffer = new char[nSize];} ~ByteBuffer() { delete[] m_cBuffer; } size_t readNet(int &v); size_t readNet(short &v); size_t read(int &v) { return read((char*)&v, 0, sizeof(int)); } size_t read(char &v) { return read((char*)&v, 0, sizeof(char)); } size_t read(short &v) { return read((char*)&v, 0, sizeof(short)); } size_t read(char *des, size_t desoffset, size_t len) { size_t tmpLen = ((m_rpos + len) > m_nSize) ? m_nSize - m_rpos : len; ::memcpy((void*)(des + desoffset), m_cBuffer + m_rpos, tmpLen); m_rpos += tmpLen; return tmpLen; } size_t writeNet(int v); size_t writeNet(short v); size_t write(int v) { return write((char*)&v, 0, sizeof(int)); } size_t write(char v) { return write((char*)&v, 0, sizeof(char)); } size_t write(short v) { return write((char*)&v, 0, sizeof(short)); } size_t write(const char *src, size_t srcoffset, size_t len) { size_t tmpLen = ((m_wpos + len) > BUFF_SIZE_MAX) ? (BUFF_SIZE_MAX - m_wpos) : len; ::memcpy(m_cBuffer + m_wpos, (void*)(src + srcoffset), tmpLen); m_nSize = ((m_wpos + tmpLen)) > m_nSize ? m_wpos + tmpLen : m_nSize; m_wpos += tmpLen; return tmpLen; } size_t rpos() const { return m_rpos; } size_t rpos(size_t rpos) { m_rpos = rpos; return m_rpos; } size_t wpos() const { return m_wpos; } size_t wpos(size_t wpos) { m_wpos = wpos; return m_wpos; } size_t readSkip(size_t skip) { if (m_rpos + skip > size()) return 0; m_rpos += skip; return skip; } size_t writeSkip(size_t skip) { if (m_wpos + skip > size()) return 0; m_wpos += skip; return skip; } size_t Available() { return m_nSize - m_rpos; } const char *data(size_t offset = 0) const { return m_cBuffer + offset; } char *data(size_t offset = 0) { return m_cBuffer + offset; } char *rdata(size_t offset = 0) { return m_cBuffer + m_rpos + offset; } const char *rdata(size_t offset = 0) const { return m_cBuffer + m_rpos + offset; } char *wdata(size_t offset = 0) { return m_cBuffer + m_wpos + offset; } const char *wdata(size_t offset = 0) const { return m_cBuffer + m_wpos + offset; } const size_t size() const { return m_nSize; } void clear() { size_t tmpLen = m_nSize - m_rpos; if (tmpLen > 0) { size_t i,j = 0; for (i = m_rpos; i < m_nSize; ++i, ++j) m_cBuffer[j] = m_cBuffer[i]; } m_wpos = m_wpos > m_rpos ? m_wpos - m_rpos:0; m_nSize = tmpLen; m_rpos = 0; } void reset() { m_nSize = m_rpos = m_wpos = 0; } };}#endif // __MK_BYTE_BUFFER_H__
cpp
#include "ByteBuffer.h"namespace ByteConverter{ template<size_t T> inline void convert(char* val) { std::swap(*val, *(val + T - 1)); convert < T - 2 > (val + 1); } template<> inline void convert<0>(char*) {} template<> inline void convert<1>(char*) {} template<typename T> inline void apply(T* val) { convert<sizeof(T)>((char*)(val)); }}namespace MK{ //--------------------------------------------- // template<typename T> T EndianConvert(char *data) { T v; ::memcpy(&v, data, sizeof(T)); if (is_littlendbian()) ByteConverter::apply<T>(&v); return v; } //--------------------------------------------- // template<typename T> T EndianConvertReverse(char *data) { T v; ::memcpy(&v, data, sizeof(T)); if (is_littlendbian()) ByteConverter::apply<T>(&v); return v; } //---------------------------------------------- // big or small change template<typename T> T ConvertDigitToNet(T v) { return EndianConvert<T>((char*)&v); } //--------------------------------------------- // big or small change template<typename T> T ConvertNetToDigit(T v) { return EndianConvertReverse<T>((char*)&v); } size_t ByteBuffer::readNet(int &v) { size_t t = read(v); v = ConvertNetToDigit(v); return t; } size_t ByteBuffer::readNet(short &v) { size_t t = read(v); v = ConvertNetToDigit(v); return t; } size_t ByteBuffer::writeNet(int v) { v = ConvertDigitToNet(v); return write(v); } size_t ByteBuffer::writeNet(short v) { v = ConvertDigitToNet(v); return write(v); }};
0 0
- c++bytebuffer留着用,要不每次要写或者找
- jquery 防止change事件每次要刷新
- 解决修改代码每次要重启服务器
- ByteBuffer
- ByteBuffer
- ByteBuffer
- ByteBuffer
- ByteBuffer
- ByteBuffer
- ByteBuffer
- ByteBuffer
- 管理路由器每次要输密码真是麻烦,自己来写个浏览器
- hdu 5063 操作逆推+mul每次要*2%(modo - 1)
- C++随机数 (rand srand)用法,注意随机数种子每次要更新。
- eclipse中代码push到github每次要输入github仓库地址
- C或者C+怎么写可以文件关联文件
- 写好会议既要不简单
- 技术管理要不要自己写代码呢
- 文件夹批量导入多个txt文件到mysql及问题解决
- Jmeter注意事项
- 常用的linux命令
- Memory Management (1)PEI 信息建立
- 《项目管理利器Maven》学习(一):Maven概述及搭建Maven开发环境
- c++bytebuffer留着用,要不每次要写或者找
- substring()在JAVA,C#,SQL中的区别
- 自定义注解(java的API)
- Windows server 2008 R2 服务器系统安全防御加固方法
- MySQL索引原理及慢查询优化
- 稀疏表示学习之路之基本概述
- Linux环境下Python操作word
- 函数嵌套例子
- 【BZOJ 2152】聪聪可可 点分治