[c++] Serialize Strings, ints и float для массивов символов для сетей БЕЗ БИБЛИОТЕК


1 Answers

Что-то вроде кода ниже сделало бы это. Следите за проблемами, в которых sizeof (unsigned int) отличается от разных систем, они вас доставят. Для таких вещей вам лучше использовать типы с четко определенными размерами, например, int32_t. Так или иначе...

unsigned int x = 123;
char y[3] = {'h', 'i', '\0'};
float z = 1.23f;

// The buffer we will be writing bytes into
unsigned char outBuf[sizeof(x)+sizeof(y)+sizeof(z)];

// A pointer we will advance whenever we write data
unsigned char * p = outBuf;

// Serialize "x" into outBuf
unsigned int32_t neX = htonl(x);
memcpy(p, &neX, sizeof(neX));
p += sizeof(neX);

// Serialize "y" into outBuf
memcpy(p, y, sizeof(y));
p += sizeof(y);

// Serialize "z" into outBuf
int32_t neZ = htonl(*(reinterpret_cast<int32_t *>(&z)));
memcpy(p, &neZ, sizeof(neZ));
p += sizeof(neZ);

int resultCode = send(mySocket, outBuf, p-outBuf, 0);
[...]

... и, конечно, код приема будет делать что-то подобное, за исключением наоборот.

Question

Я хочу передавать данные по сети, но я не хочу использовать какие-либо внешние библиотеки (стандартный C / C ++ в порядке).

например:

unsigned int x = 123;
char y[3] = {'h', 'i', '\0'};
float z = 1.23f;

Я хочу это в

char xyz[11];

массив.

Примечание. Чтобы передать его по сети, мне нужен сетевой байтовый порядок для неподписанного int (функция htonl), тогда мне нужно как-то сериализовать float, чтобы быть в форме IEEE 754 (это множество функций в Интернете), и я это знаю.

Как я могу получить их в xyz-Array, красиво выстроенный из конца в конец, поэтому я могу использовать это как буфер для моей функции socket + send ()? Очевидно, что у меня есть обратные функции (ntohl и обратный IEEE 754), чтобы получить их, но мне нужна техника там, желательно то же самое ...

Это было бы примерно так:

xyz in binary: 
00000000 0000000 00000000 01111011 | 01101000 | 01101001 | 00000000 | 00111111 10011101 01110000 10100100
- big endian repr. of u. int 123 - | - 'h'  - | - 'i'  - | - '\0' - | -   IEEE 754 repr of float 1.23   -

Как я могу выполнить это без внешних библиотек и минимально использовать стандартные библиотечные функции? Это не столько для моей программы, сколько для меня.




Какова ваша цель? И какие именно средства вы готовы использовать?

Если вы просто хотите выполнить работу с одним конкретным компилятором на одном конкретном компьютере, самым быстрым и простым, но самым грязным решением является использование объединения. Вы определяете структуру, которая имеет ваши элементы в качестве элементов и объединяет их с массивом символов. Вам нужно сказать компилятору, чтобы он собрал действительно плотно, что-то вроде #pragma pack (1), и ваша проблема решена. Вы просто сохраняете три значения в элементах, а затем смотрите на них как на массив символов.

Если машина немного ориентирована, и вам нужны большие endian ints / floats, вы просто меняете соответствующие символы.

Но есть еще несколько десятков решений, которые приходят на ум, если у вас есть другие цели, такие как переносимость, нестандартный порядок байтов, sizeof (int)! = 4, float не сохраняется в формате IEEE внутри и т. Д.




Related