网络编程中的大小端字节序详解
2018-03-22 14:43
381 查看
最近公司项目整改,组长让整改下自己所属模块的大小端字节序。以前自己整理过大小端字节序,不过这次再次整理的时候,发现自己对这些用法还是理解的不够透彻。
主要有以下的一些疑问:
1.我认为ntoh和hton其实就是一样的函数,换了个名字而已。里面的实现本质就是进行顺序互换。
端模式:字节序分为大端字节序和小端字节序,也就是字节在内存中的顺序。
小端字节序:低字节存放于内存低地址,高字节存放于内存高位地址。
如一个数据0x12345678
0x0029f458 0x78
0x0029f459 0x56
0x0029f45a 0x34
0x0029f45b 0x12
内存地址的大小顺序为0x0029f458< 0x0029f459<0x0029f45a<0x0029f45b
数据的大小顺序为0x78<0x56<0x34<0x12
小数据在小的内存地址中,所以为小端字节序。
大端字节序和以上就相反。
网络字节序都是大端字节序
字节序转化函数
htonl ntohl htons ntohs
h代表host,主机
n代表net,网络
c/s架构的传输
1.一段调用hton的时候,在另一端接收到的时候,只要对应的调用ntoh。那就是不会有问题的。
2.主机cpu的结构决定了自己本端是大端还是小端。如果自己本端本身本身就是大端字节序,那么就收到网络上的数据之后,就算执行ntoh函数,也是不做任何的处理。因为就是相当于大端转化为大端了。ntoh函数内部会判断主机本身是大端还是小端序。
主要有以下的一些疑问:
1.我认为ntoh和hton其实就是一样的函数,换了个名字而已。里面的实现本质就是进行顺序互换。
端模式:字节序分为大端字节序和小端字节序,也就是字节在内存中的顺序。
小端字节序:低字节存放于内存低地址,高字节存放于内存高位地址。
如一个数据0x12345678
0x0029f458 0x78
0x0029f459 0x56
0x0029f45a 0x34
0x0029f45b 0x12
内存地址的大小顺序为0x0029f458< 0x0029f459<0x0029f45a<0x0029f45b
数据的大小顺序为0x78<0x56<0x34<0x12
小数据在小的内存地址中,所以为小端字节序。
大端字节序和以上就相反。
网络字节序都是大端字节序
字节序转化函数
htonl ntohl htons ntohs
h代表host,主机
n代表net,网络
c/s架构的传输
1.一段调用hton的时候,在另一端接收到的时候,只要对应的调用ntoh。那就是不会有问题的。
2.主机cpu的结构决定了自己本端是大端还是小端。如果自己本端本身本身就是大端字节序,那么就收到网络上的数据之后,就算执行ntoh函数,也是不做任何的处理。因为就是相当于大端转化为大端了。ntoh函数内部会判断主机本身是大端还是小端序。
相关文章推荐
- 大小端字节序存在的意义,为什么不用一个标准呢? 在网络编程和一些服务器中采用的是大端的字节序,而一般的主机采用的是小端的字节序,为什么要分成两种?不能合成一个吗?
- linux网路编程:字节序(大端、小端、网络、主机)
- linux网络编程之网络字节序、主机字节序、大端、小端
- python socket网络编程步骤详解(socket套接字使用)
- C# 网络编程之豆瓣OAuth2.0认证详解和遇到的各种问题及解决
- 网络编程中何时转换传输数据的字节序
- 【Unix 网络编程】TCP状态转换图详解
- 高并发网络编程之epoll详解
- Java网络编程精解之ServerSocket用法详解一
- linux 网络编程函数详解
- 网络编程__网络字节序和地址字节序转化
- linux网络编程之socket(一):socket概述和字节序、地址转换函数
- 【网络编程】大端模式和小端模式
- java 网络编程之ServerSocket详解
- 字节序(大小端)详解从高低地址和高低位开始理解
- java网络编程之Socket用法详解一
- Java网络编程精解之ServerSocket用法详解一
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- [windows网络编程]tcp/udp编程初步详解-转
- Java网络socket编程详解