упаковка битов в формате фиксированной длины - PullRequest
0 голосов
/ 25 мая 2018

Я работаю над приложением, в котором мы собираемся отправить сообщение от клиента на сервер.Сообщение будет иметь 64 поля, и эти поля будут скопированы в одну символьную строку через соединение через сокет TCP.Сообщение может содержать не все 64 поля.Таким образом, чтобы решить эту проблему, перед всеми этими 64 полями будет поле, которое будет длиной 8 символов, которое будет содержать информацию об этих полях, то есть какое поле присутствует, а какое нет.Проблема, с которой я сейчас сталкиваюсь, заключается в том, что, если у меня установлен 1-й, 3-й и 5-й биты, длина полученной битовой карты будет равна 1, а при копировании ее в символьную строку, которая будет отправлена ​​только на сервер 1символьная строка достигает там, как и со второй стороны, в которой раньше было '\ 0'.И если я помещу '0' в оставшееся пространство (то есть со 2-го по 8-е) и получу другие поля, а также установлю (см. Вывод).Итак, мой вопрос, есть ли способ сохранить длину строки ровно 8, и она не установит и любой другой бит, чтобы сервер мог извлечь правильное сообщение.Просто повторяем его еще раз, формат сообщения - 8-битная карта битов, а затем все упакованное сообщение из 64 полей.

#include <iostream>
#include <cstring>
#define ISO_LEN 64
using namespace std;
int main()
{
    int i ;
    bool    bitmap[ISO_LEN];
    for(i = 0; i  < ISO_LEN; i++)
    {
         bitmap[i] = false;
    }

    bitmap[1] = true; bitmap[3] = true; bitmap[5] = true;
    unsigned char bmap[ISO_LEN/8 + 1];
    for (int i = 0; i < ISO_LEN/8; bmap[i++] = 0);

    for (int i = 0; i < ISO_LEN; i++)
    {
        if (bitmap[i])
        {
            bmap[i/8] |= (unsigned char)(0x80 >> (i%8));
        }
    }
//  intentional effort to make the length exactly 8
    int start = strlen(bmap);
    for (int i = start; i < ISO_LEN/8 ; i++)
    {
        bmap[i] = '0';
    }
//  ends

    char *sendee = new char[1000];
    memcpy(sendee , bmap, ISO_LEN/8); 

    for (int i = 0; i < ISO_LEN; i++) 
    {
        if (sendee[i/8] & ((unsigned char)0x80 >>  (i % 8))) 
        {
                   cout<<i<<"th bit is true\n";
        }
        else
        {
                   cout<<i<<"th bit is false\n";
        }
    }
    return 0;
}

Output:
0th bit is false
1th bit is true
2th bit is false
3th bit is true
4th bit is false
5th bit is true
6th bit is false
7th bit is false
8th bit is false
9th bit is false
10th bit is true
11th bit is true
12th bit is false
13th bit is false
14th bit is false
15th bit is false
16th bit is false
17th bit is false
18th bit is true
19th bit is true
20th bit is false
21th bit is false
22th bit is false
23th bit is false
24th bit is false
25th bit is false
26th bit is true
27th bit is true
28th bit is false
29th bit is false
30th bit is false
31th bit is false
32th bit is false
33th bit is false
34th bit is true
35th bit is true
36th bit is false
37th bit is false
38th bit is false
39th bit is false
40th bit is false
41th bit is false
42th bit is true
43th bit is true
44th bit is false
45th bit is false
46th bit is false
47th bit is false
48th bit is false
49th bit is false
50th bit is true
51th bit is true
52th bit is false
53th bit is false
54th bit is false
55th bit is false
56th bit is false
57th bit is false
58th bit is true
59th bit is true
60th bit is false
61th bit is false
62th bit is false
63th bit is false
...