cococ2dx基于c++读取字节流

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

--------------------------------------------------------.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

 

--------------------------------------------------------.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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值