老问题, 网络编程中, 传输int, word等受大端小端影响的数据类型如何处理 老问题, 网络编程中, 传输int, word,long等受大端小端(跨平台)影响的数据类型如何处理?在网络编程中结构体传输是否一定要进行序列化才行呢 ? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 格式化成对应的字符串现在有用xml作为数据传输接口了 这样影响了服务器的性能吧, 能不能不将int,word类型的数据转换成字符串呢?用其它方法?还有, 感觉现在是不是百分之八九十的CPU都是小端字节序? 自己定义数据类型,不适用系统的那几个typedef unsigned char uint8;typedef unsigned short uint16;typedef unsigned long uint32; typedef unsigned __int64 uint64; htonl, htons, ntohl, ntohs 不太明白大家讨论的,用这几个函数不可以吗。? 我也不太明白大家讨论的,把int word long等当做一个结构传过去,那边恢复不行吗? 你说的大端小端问题不存在 传输的时候是字节流,直接转换成char传输就可以了 大端小端和传输有什么关系?你自己约定好了一种解析方式就可以了。就和int和unsigned int的关系一样,你当成什么就是什么。 传输的时候肯定是二进制 进行传送, 但是你另一端对这个二进制进行解析的时候, 如果直接将二进制转换成int,word,long , 不同的大端小端系统,转换成数值的时候是不一样的吧? 问题是把int, word, long,结构体等类型的数据转换成字符串有点麻烦! 其实我是想问问大家对于这种现象是如何解决的, (最好能说说在游戏服务器中如何解决的)///////////////////////////////数值:0x1245在X86系统中这样存储内存地址 数据00 1201 45发送时从低地址读取数据所以发送顺序为 12 45而在其它系统中有可能这样存储:内存地址 数据00 4501 12如果不转换为网络字节序,按 45 12发送,则X86系统就理解为0x4512了。 ///////////在上面这种情况下, 我们如何保证另外一端(不确定是什么类型的系统)正确接收数据呢? 标准的网络程序是要求发送时转字节序的。 如果不转,两侧都是X86自然不会有什么问题,一般X86,一边PowerPC自然就挂了,这个问题现在是必须考虑的,上网本以后可能会流量ARM,MIPS等架构,而且即使在一台x86机器上,WINdows下的程序和java虚拟机的程序通讯时也会出问题,至于htonl,htons转字节序那点消耗,大可直接忽略,如果需要转的太多,可自己定义宏去转来提高性能。除了网络程序,读写二进制文件也存在相同问题。 所以严格来说: 一块二进制数据,可能是数据包,内存数据,文件等在可能不同字节序环境下使用时,必须要转为统一字节序。如果仅仅为了实现功能,楼主将转字节序的功能交给客户端,当然,这样是不合理的。 客户端如果和服务端字节序一样,则不转。不一样,则转,服务端不用做任何操作,如果服务端也有多种字节序,还真是比较麻烦。 求助!我的多线程..... 对话框resizing属性,怎么做才能拖动边缘显示虚线。 连接mysql的问题 将基本对话框类做到dll里的问题 关于java和c++之间使用socket的数据包传输的问题 有没监控主线程一个全局变量改变后得以知道方法或函数 ClistCtrl的小问题 那位高手用过Tab Control,请指示:急急!! 困惑!请求帮助 精品图书《代码大全》电子书哪里有下载? 系统是如何区分已分配内存,和未分配内存的? sendmessage给派生自cwnd类的类发送消息问题
还有, 感觉现在是不是百分之八九十的CPU都是小端字节序?
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
typedef unsigned __int64 uint64;
不太明白大家讨论的,用这几个函数不可以吗。?
问题是把int, word, long,结构体等类型的数据转换成字符串有点麻烦!
///////////////////////////////数值:0x1245
在X86系统中这样存储
内存地址 数据
00 12
01 45发送时从低地址读取数据
所以发送顺序为 12 45而在其它系统中有可能这样存储:
内存地址 数据
00 45
01 12
如果不转换为网络字节序,按 45 12发送,则X86系统就理解为0x4512了。
///////////
在上面这种情况下, 我们如何保证另外一端(不确定是什么类型的系统)正确接收数据呢?
标准的网络程序是要求发送时转字节序的。 如果不转,两侧都是X86自然不会有什么问题,一般X86,一边PowerPC自然就挂了,这个问题现在是必须考虑的,上网本以后可能会流量ARM,MIPS等架构,而且即使在一台x86机器上,WINdows下的程序和java虚拟机的程序通讯时也会出问题,至于htonl,htons转字节序那点消耗,大可直接忽略,如果需要转的太多,可自己定义宏去转来提高性能。除了网络程序,读写二进制文件也存在相同问题。 所以严格来说: 一块二进制数据,可能是数据包,内存数据,文件等在可能不同字节序环境下使用时,必须要转为统一字节序。如果仅仅为了实现功能,楼主将转字节序的功能交给客户端,当然,这样是不合理的。
客户端如果和服务端字节序一样,则不转。
不一样,则转,服务端不用做任何操作,如果服务端也有多种字节序,还真是比较麻烦。