84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
unp里讲到不同平台传输二进制会因为字节序或者位数不同的问题产生问题,那应该怎么解决这个问题呢? 新手。。。求大神提供点这方面的资料。。。 还有为什么传字符串就不会有问题呢? 不会有问题的是一个字节的字符吧。。比如ASCII码,一个字符只占一个字节那不会有字节序问题,那要传多字节字符呢?比如传输中文 大端小端存储的也不一样吧? 难道不会有问题?
欢迎选择我的课程,让我们一起见证您的进步~~
统一小端就行了. 虽然网络字节序都是大段. 但是, 但是, 目前最流行的设备, 也就是x86, 是小端的, 然后那些大端的机器, 同时也支持小端. 像arm, powerpc都是支持小端的. 所以不要管, 就小端.
字节序一般是对数字而言的,字符串中编码就定义了字节的顺序,所以使用相同的字符串编码就确定了它相同的字节顺序。而数字的字节序是历史问题,目前都还没统一,要处理数字字节序的问题也很简单,不要使用系统默认的数字写入或读取方式去读取数据(因为这样采用的是默认的字节序),而是自己通过程序将数字拆成大端或者小端的数个字节,在读取时也是手动组合大端或者小端的数据,这样就保证了读写有统一的字节序。
写的时候指定Big-Endian或者Little-Endian,读的时候用相同的顺序。
字节序的本质问题是两个字节以及以上的类型值的问题,网络传输数据的时候是二进制流,数据发送时什么样,接收时还是什么样,如果在socket两端的机器大小端相同,或者并没有两个字节以上的数据(就像字符串都是单个字节组成的数据,但是如果struct里面包含了多字节数据就需要转换了),网络字节序便没什么用,只有socket两端的机器大小端不一样,他们对于二进制数据比如0x1234的理解才不一样,所以你需要调用hton*那一系列的函数进行相应的转换才能得到正确的数据。
统一小端就行了. 虽然网络字节序都是大段. 但是, 但是, 目前最流行的设备, 也就是x86, 是小端的, 然后那些大端的机器, 同时也支持小端. 像arm, powerpc都是支持小端的. 所以不要管, 就小端.
字节序一般是对数字而言的,字符串中编码就定义了字节的顺序,所以使用相同的字符串编码就确定了它相同的字节顺序。而数字的字节序是历史问题,目前都还没统一,要处理数字字节序的问题也很简单,不要使用系统默认的数字写入或读取方式去读取数据(因为这样采用的是默认的字节序),而是自己通过程序将数字拆成大端或者小端的数个字节,在读取时也是手动组合大端或者小端的数据,这样就保证了读写有统一的字节序。
写的时候指定Big-Endian或者Little-Endian,读的时候用相同的顺序。
字节序的本质问题是两个字节以及以上的类型值的问题,网络传输数据的时候是二进制流,数据发送时什么样,接收时还是什么样,如果在socket两端的机器大小端相同,或者并没有两个字节以上的数据(就像字符串都是单个字节组成的数据,但是如果struct里面包含了多字节数据就需要转换了),网络字节序便没什么用,只有socket两端的机器大小端不一样,他们对于二进制数据比如0x1234的理解才不一样,所以你需要调用hton*那一系列的函数进行相应的转换才能得到正确的数据。