以前写过页游ActionScript3.0,里边有个ByteArray类对数据流进行操作,zengrong(博客)实现了lua版本的ByteArray,但由于自己项目网络socket通信内核都写在了C++端,而游戏UI逻辑等则写在了LUA端,这就涉及到了LUA与C++之间的数据传递,故自己写了C++版本的ByteArray类导出给lua使用。
先简单说下原理,由于字节int、short等在内存中都可以用char表示,一个int等于4个char,之间可以相互转化;另字节序有大端小端之分,通常x86架构下用的都是小端little endian。
下面是代码,与ActionScript3.0中ByteArray类似
//
// ByteArray.hpp
// GameProject
//
// Created by jt on 15-09-04.
//
//
#ifndef __JT_BYTEARRAY_H_
#define __JT_BYTEARRAY_H_
#include "cocos2d.h"
USING_NS_CC;
#include <string>
using namespace std;
/**
* C++版ByteArray
**/
class ByteArray : public Ref
{
public:
static ByteArray* create(int len,int endian = ENDIAN_LITTLE);
//C++中创建使用,不导出至LUA
static ByteArray* createWithBuffer(char* buffer,int len,int endian = ENDIAN_LITTLE);
static int checkCPUEndian();
static const int ENDIAN_LITTLE = 0;
static const int ENDIAN_BIG = 1;
bool readBool();
void writeBool(bool value);
short readShort();
void writeShort(short value);
unsigned short readUnsignedShort();
void writeUnsignedShort(unsigned short value);
int readInt();
void writeInt(int value);
/**
* 从字节流中读取一个无符号的 32 位整数。
* 32位系统下int与long同4字节
**/
unsigned int readUnsignedInt();
void writeUnsignedInt(unsigned int value);
long long readLongLong();
void writeLongLong(long long value);
string readString(int len);
void writeString(string value);
char readByte();
void writeByte(char value);
unsigned char readUnsignedByte();
void writ