c – 将Strings,int和floats序列化到不带LIBRARIES的网络的字符数组

前端之家收集整理的这篇文章主要介绍了c – 将Strings,int和floats序列化到不带LIBRARIES的网络的字符数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想通过网络传输数据,但是我不想使用任何外来的库(标准C/C++可以).

例如:

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

我想要这个

char xyz[11];

阵列.

注意:
要通过网络传输,我需要使用无符号int(htonl函数)的网络字节顺序,那么我需要以某种方式将浮点数序列化为IEEE 754格式(Internet上的许多函数),我知道它.

如何让它们进入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   -

如何在没有外部库的情况下完成此操作,并尽量少使用标准库函数?这对我的程序来说并不是那么好,就像我从中学习一样.

解决方法

啊,你想序列化原始数据类型!原则上有两种方法:第一种方法是,您只需抓取要串行化的数据的内部内存二进制表示形式,将其重新解释为字符,并将其用于表示:

所以如果你有一个:

double d;

你拿这个地址,重新解释那个指针作为指向字符的指针,然后使用这些字符:

double *pd=&d;
char *pc = reinterpret_cast<char*>(pd); 
for(size_t i=0; i<sizeof(double); i++) 
{
   char ch = *pc;   
   DoSomethingWith(ch);   
   pc++;
}

这适用于所有原始数据类型.这里的主要问题是,binray表示是依赖于实现的(主要取决于cpu). (当您尝试使用IEEE NAN …)时,您将遇到微妙的错误…).

总而言之,这种方法根本不可移植,因为您无法控制数据的表示.

第二种方法是使用更高级别的代表,使您自己受到控制.如果性能不是问题,可以使用std :: strstream和>>和<运算符将原始C类型变量流入std :: strings.这很慢但易于阅读和调试,并且非常便于携带.

原文链接:https://www.f2er.com/c/112227.html

猜你在找的C&C++相关文章