我想通过网络传输数据,但是我不想使用任何外来的库(标准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.这很慢但易于阅读和调试,并且非常便于携带.