在整个网络中发送布尔数组

时间:2015-08-05 02:06:27

标签: c++ networking websocket cocos2d-x

我正在尝试使用C ++上的websocket发送一个二维布尔数组 websocket中有一个alias find='find -regextype posix-extended' 结构,它看起来像这样:

"data"

在这里,我想使用上面的结构发送以下数据包。

/**
 * Data structure for message
 */
struct Data
{
    Data():bytes(nullptr), len(0), issued(0), isBinary(false){}
    char* bytes;
    ssize_t len, issued;
    bool isBinary;
};

在这个数组中,Threre是228个布尔值,我正在考虑将整个信息复制到char数组,即数据中的bool[12][19] info; 。 这将导致228个char值。

我想我能做到这一点,但我觉得它不那么有效 有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

使用位。但是你应该像hash一样维护索引。所以一个字节可以呈现8位布尔值。对于你的情况,可能你需要char [228/8 +1]。

答案 1 :(得分:0)

将其存储在位图中。鉴于您知道2d数组的尺寸,很容易找到相应的单维数组的长度。在大多数c ++实现中,char代表8位存储空间(当然cocos2d-x支持所有这些存储空间)。

这样的事情证明了基本的想法:

#include <assert.h>
static const size_t char_bits = 8;
static const size_t serializedSize = (12*19+(char_bits-1))/(char_bits);

class ByteArraySerialize
{
protected:

void serialize(char* dst, bool src[12][19]){
  for(int x=0; x<12; x++){
    for(int y=0; y<19; y++){
      bool b = src[x][y];
      int i=x*19+y;
      assert(i < serializedSize*char_bits);
      int i_char = i / char_bits;
      int i_bit = i % char_bits;
      if(b)
        dst[i_char] |= 1 << i_bit;
      else
        dst[i_char] &= ~(1 << i_bit);
    }
  }
}

void deserialize(bool dst[12][19], const char* src){
  for(int x=0; x<12; x++){
    for(int y=0; y<19; y++){
      int i=x*19+y;
      assert(i < serializedSize*char_bits);
      int i_char = i / char_bits;
      int i_bit = i % char_bits;
      bool b = ((src[i_char] >> i_bit) & 0x01) != 0;
      dst[x][y] = b;
    }
  }
}

public:
ByteArraySerialize(){
  char charbuf[serializedSize];
  bool data_1[12][19] = { 0 };
  bool data_2[12][19] = { 0 };
  for(int x=0; x<12; x++)
    for(int y=0; y<19; y++)
      data_1[x][y] = rand()%1!=0;
  serialize(charbuf,data_1);
  deserialize(data_2, charbuf);

  for(int x=0; x<12; x++)
    for(int y=0; y<19; y++)
      assert(data_1[x][y] == data_2[x][y]);
}
};

ByteArraySerialize testByteArray;