2015-08-05 6 views
0

Я пытаюсь отправить двумерный булевой массив, используя websocket на C++.
Существует "data" структуры в WebSocket и это выглядит следующим образом:Отправка булевого массива по сети

/** 
* 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; 

Threre является 228 логическим значением в этом массиве, и я думал о копировании всей информации в массив символов, который в данных bytes. Приведем 228 значений char.

Я думаю, что смогу это сделать, но я чувствую, что это не так эффективно.
Есть ли лучший способ сделать это?

ответ

1

Использовать бит. Но вы должны поддерживать индексирование как хэш. Таким образом, байт может содержать 8 бит булевых. Для вашего случая, возможно, ваша потребность char [228/8 +1] полностью.

+0

Подождите, не могли бы вы дать мне пример? Я все еще запутался, так как я должен использовать массив символов для отправки этой информации. –

+0

Возможно, вы имели в виду char [228/8 + 1]? –

+0

Да, точно так же, как реализация std :: vector

0

Сохраните его в растровом изображении. Учитывая, что вы знаете размеры вашего 2d-массива, легко найти длину соответствующего одномерного массива. A char представляет 8 бит хранилища в большинстве реализаций C++ (конечно, все, что поддерживается 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; 
Смежные вопросы