各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb
一、 为什么需要“翻译”?(大端与小端)
计算机在存储多字节数据(如整数)时,有两种流派:
- 小端序 (Little-Endian):主机字节序。大部分 PC(x86 架构)默认采用。它是“低位在前”,例如
0x1234存为34 12。 - 大端序 (Big-Endian):网络字节序。TCP/IP 协议规定,在网络上传输数据必须使用这种顺序。它是“高位在前”,例如
0x1234存为12 34。
结论:在发送 IP 地址(32位)和端口号(16位)之前,必须将它们从主机序转换为网络序,否则服务器根本认不出你是谁。
二、 转换函数的“助记词”解析
C 语言库提供了一组函数来完成这种转换。看似复杂,其实只要看懂函数名中的缩写,就能秒懂它们的用途:
| 关键字 | 英文全称 | 含义 |
|---|---|---|
| h | host | 主机(本地字节序) |
| n | net | 网络(网络字节序) |
| s | short | 16位整数(通常用于端口号) |
| l | long | 32位整数(通常用于IPv4 地址) |
组合示例:
htons:HosttoNetShort (把本地端口转为网络端口)ntohl:NettoHostLong (把网络收到 IP 包转为本地整数)
三、 代码实战 1:端口与整形 IP 的转换
这个示例演示如何将本地的端口号和数字形式的 IP 地址转换为网络标准格式。
代码示例 (endian_convert.c)
#include<stdio.h>#include<arpa/inet.h>intmain(){// 1. 端口转换 (16位)// 假设端口号是 0x1234 (十进制 4660)unsignedshorthost_port=0x1234;unsignedshort