使用ACE_CDR类进行网络编解码(5-1)
时间:2010-10-25 来源:ronat
在网络上传输数据,我们需要对数据进行编码和解码。网络传输的编解码通常要处理字节序和紧缩的问题。
字节序就是超过一个字节的数据类型在内存中的表示方式。关于字节序的详细介绍请在网上搜索相应的文章。约定的网络字节序采用大端表示法,
但是intel架构的PC机,包括现在很多intel芯片的服务器都是用小端表示法。早期的大型机和小型机多用大端表示法。 现在来看,网络字节序采用大端表示法,其实是很不“环保”的。互联网中的绝大多数电脑是用小端表示法,可偏偏选用大端表示法作为网络字节序。
这样导致了很多没必要的转换。如果网络字节序采用小端表示法,每天发生在互联网上的字节序转换会少得多,呵呵。 除非你写的是一个封闭的系统,且你可以100%肯定系统内所有机器都使用相同的字节序,否则还是应该坚持使用网络字节序(也就是大端big-endian表示法)
来进行网络数据的编解码。 一般用htons,htonl进行本地字节序到网络字节序的转换,即(host to net),前者处理short即2字节整数,后者处理long即4字节整数。
如果本地字节序也是大端表示法,则这两个方法什么也不做。在有的系统上这两个方法被实现成宏,以节约一次调用开销。于之对应的还有ntohs和ntohl,
负责从网络字节序转换到本地字节序。 对于long long类型即8字节整数,就只能自己进行转换,比较麻烦。 紧缩一般是为了避免不同主机间字节对齐的标准不一样,同时还可以节约带宽。比如下面的结构体。
在windows平台用vc编译,默认情况下这个结构体的实例的大小为8个字节,即按4字节进行了对齐。一般对于这样的数据在编码时会进行一次紧缩,
紧缩后变为5个字节。解码时再对逐个成员赋值一次,恢复为本地标准。 自行处理这些细节,并不复杂,但很繁琐。而且出了问题调试很麻烦,一般要直接看内存buffer才能定位问题。所以尽量不要自己干这个事。
但是intel架构的PC机,包括现在很多intel芯片的服务器都是用小端表示法。早期的大型机和小型机多用大端表示法。 现在来看,网络字节序采用大端表示法,其实是很不“环保”的。互联网中的绝大多数电脑是用小端表示法,可偏偏选用大端表示法作为网络字节序。
这样导致了很多没必要的转换。如果网络字节序采用小端表示法,每天发生在互联网上的字节序转换会少得多,呵呵。 除非你写的是一个封闭的系统,且你可以100%肯定系统内所有机器都使用相同的字节序,否则还是应该坚持使用网络字节序(也就是大端big-endian表示法)
来进行网络数据的编解码。 一般用htons,htonl进行本地字节序到网络字节序的转换,即(host to net),前者处理short即2字节整数,后者处理long即4字节整数。
如果本地字节序也是大端表示法,则这两个方法什么也不做。在有的系统上这两个方法被实现成宏,以节约一次调用开销。于之对应的还有ntohs和ntohl,
负责从网络字节序转换到本地字节序。 对于long long类型即8字节整数,就只能自己进行转换,比较麻烦。 紧缩一般是为了避免不同主机间字节对齐的标准不一样,同时还可以节约带宽。比如下面的结构体。
struct a |
紧缩后变为5个字节。解码时再对逐个成员赋值一次,恢复为本地标准。 自行处理这些细节,并不复杂,但很繁琐。而且出了问题调试很麻烦,一般要直接看内存buffer才能定位问题。所以尽量不要自己干这个事。
相关阅读 更多 +