我想通过网络传输数据,但我不想使用任何外部库(标准C/C++就可以)。
例如:
unsigned int x = 123;
char y[3] = {'h', 'i', '\0'};
float z = 1.23f;
我想要这个
char xyz[11];
array.
笔记:
为了通过网络传输它,我需要 unsigned int (htonl 函数)的网络字节顺序,然后我需要以某种方式将浮点数序列化为 IEEE 754 形式(互联网上有很多函数),我知道这一点。
如何将它们放入 xyz 数组中,首尾相连,以便我可以将其用作套接字 + 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 -
在没有外部库和最少使用标准库函数的情况下如何实现这一目标?这与其说是为了我的程序,不如说是为了我学习。
啊,你想序列化原始数据类型!原则上,有两种方法:第一种方法是,您只需获取要序列化的数据的内部内存中二进制表示形式,将其重新解释为字符,然后将其用作表示形式:
所以如果你有:
双 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 以及 >> 和
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)