通过网络发送布尔数组

Posted

技术标签:

【中文标题】通过网络发送布尔数组【英文标题】:Sending a boolean array across the network 【发布时间】:2015-08-05 02:06:26 【问题描述】:

我正在尝试在 C++ 上使用 websocket 发送一个二维布尔数组。 websocket中有一个"data"结构,它看起来像这样:

/**
 * Data structure for message
 */
struct Data

    Data():bytes(nullptr), len(0), issued(0), isBinary(false)
    char* bytes;
    ssize_t len, issued;
    bool isBinary;
;

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

bool[12][19] info;

这个数组中有 228 个布尔值,我正在考虑将整个信息复制到 char 数组中,即数据中的 bytes。 这将产生 228 个字符值。

我认为我可以这样做,但我觉得它不是那么有效。 有更好的方法吗?

【问题讨论】:

【参考方案1】:

使用位。但是您应该像哈希一样维护索引。所以一个字节可以表示 8 位布尔值。对于您的情况,可能您完全需要 char[228/8 +1] 。

【讨论】:

等等,你能给我举个例子吗?我仍然很困惑,因为我必须使用 char 数组来发送该信息。 你指的是 char[228/8+1] 吗? 是的,就像 std::vector 的实现【参考方案2】:

改为将其存储在位图中。鉴于您知道二维数组的维度,很容易找到相应一维数组的长度。 char 表示大多数 c++ 实现(当然所有 cocos2d-x 都支持)的 8 位存储。

类似这样的东西展示了基本思想:

#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;

【讨论】:

以上是关于通过网络发送布尔数组的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 GCM.send 在包中发送整数、布尔值

通过布尔掩码数组选择numpy数组的元素

Java 通过另一个大小为 n 的布尔数组过滤数组

通过 HTTPWebRequest 发送文件并在网络服务器上从 $_FILES 接收

NumPy 数组切片索引

使用OR将3D布尔数组缩减为2D