cococ2dx基于c++读取字节流

基于cocos2dx c++读取字节流函数

基于c++的,可以读取基本类型,含有大小端判定,直接上代码,复制可用

CCBufferReader.h


#ifndef __CC_BUFFER_READER_H__
#define __CC_BUFFER_READER_H__

#include "CCBufferReader.h"
#include "base/CCValue.h"
#include <string>
NS_CC_BEGIN
enum Endian
{
    BIG_ENDIAN_MODE,
    LITTLE_ENDIAN_MODE
};

class BufferReader
{
public:
unsigned char readByte();
short readShort();
int readInt();
float readFloat();
std::string* readString();
BufferReader(unsigned char* buffer, int size, Endian endian);
 ~BufferReader();

private:
    int read();
private:
    static const int ERROR_OF_EOF = -1;
    Endian m_endian;
    unsigned char* m_buffer;
    int m_size;
    int m_currentPosition;
};

NS_CC_END

#endif

CCBufferReader.cpp

#include "CCBufferReader.h"
#include <stdio.h>
#include <stdlib.h>

NS_CC_BEGIN

BufferReader::BufferReader(unsigned char* buffer, int size, Endian endian):
    m_buffer(buffer),
    m_size(size),
    m_endian(endian),
    m_currentPosition(0)
{
}

BufferReader::~BufferReader()
{
}

int BufferReader::read()
{
    if(m_currentPosition < m_size)
    {
        unsigned char* pdata = m_buffer;
        pdata += m_currentPosition;
        unsigned  char data = *(pdata++);
        m_currentPosition++;
        return data;
    }
    return -1;    
}

unsigned char BufferReader::readByte()
{
   return read();
}

short BufferReader::readShort()
{
    int ch1 = read();
    int ch2 = read();
    if(m_endian == BIG_ENDIAN_MODE)
    {
        return (short)((ch1 << 8) | ch2);
    }
    else
    {
       return (short)((ch2 << 8) | ch1);
    }    

}

int BufferReader::readInt()
{
    int ch1 = read();
    int ch2 = read();
    int ch3 = read();
    int ch4 = read();
    if(m_endian == BIG_ENDIAN_MODE)
    {
        return (int)((ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4);
    }
    else
    {
        return (int)((ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1);
    }    
}

float BufferReader::readFloat()
{
    int value = readInt();
    float f;
    memcpy(&f, &value, sizeof(float));
    return f;
}

std::string* BufferReader::readString()
{
    unsigned int size = readShort();
    try
    {
        char* str = new char[size + 1];
        for(int i = 0; i < size; i++)
        {
            str[i] = read();
        }
        str[size] = '\0';
        auto ret = new std::string(str);
        delete str;
        return ret;
    }
    catch(const std::bad_alloc& e)
    {

        printf("Malloc failed");
        return NULL;
    }    
}
NS_CC_END

如有错误,大家可以一起交流 联系方式 qq: 940299880

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值