c – 将Strings,int和floats序列化到不带LIBRARIES的网络的字符
我想通过网络传输数据,但是我不想使用任何外来的库(标准C/C++可以).
例如: unsigned int x = 123; char y[3] = {'h','i',' '}; float z = 1.23f; 我想要这个 char xyz[11]; 阵列. 注意: 如何让它们进入xyz-Array,最后排列齐全,所以我可以用它作为我的socket send()函数的缓冲区?显然,我有反向功能(ntohl和一个反向的IEEE 754)来得到它们,但是我也需要一个技术,最好是相同的… 这将是这样的: xyz in binary: 00000000 0000000 00000000 01111011 | 01101000 | 01101001 | 00000000 | 00222221 10011101 01110000 10100100 - big endian repr. of u. int 123 - | - 'h' - | - 'i' - | - ' ' - | - IEEE 754 repr of float 1.23 - 如何在没有外部库的情况下完成此操作,并尽量少使用标准库函数?这对我的程序来说并不是那么好,就像我从中学习一样. 解决方法
啊,你想序列化原始数据类型!原则上有两种方法:第一种方法是,您只需抓取要串行化的数据的内部内存二进制表示形式,将其重新解释为字符,并将其用于表示:
所以如果你有一个:
你拿这个地址,重新解释那个指针作为指向字符的指针,然后使用这些字符: 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.这很慢但易于阅读和调试,并且非常便于携带. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |