Linux 网络基础(字节序篇)
版权声明:
本文为 博主原创文章,遵循 CC 4.0 BY-SA 版权协议
转载请附上原文出处链接和本声明
一、字节序大小端
字节序,就是 大于一个字节类型的数据在内存中的存放顺序。
是在跨平台和网络编程中,时常要考虑的问题。
网络IP地址都是大端模式
网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。
1、大小端简介
- Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
- Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
在网络传输中都是以大端模式来收发数据的(网络字节序)
2、C语言判断大小端
判断大小端的方式有多种,下面我以最简单易懂的方式来判断大小端
int main(int argc,const char * argv[])
{
int data = 0X12345678;
//data 会将其内存中最低地址 1字节数据 赋值给 size
unsigned char size = (unsigned char *)data;
//data低地址1字节为0x12
if (size == 0X12)
{
printf("大端\n");
}
//data低地址1字节为0x78
if (size == 0X78)
{
printf("小端\n");
}
return 0;
}
二、大小端 C语言函数
- API涉及库 Linux网络编程 - <arpa/inet.h>
1、将十进制数字转成网络字节序
uint16_t htons(uint16_t data)
函数功能:
小端转大端将short类型的整数转成网络字节序(大端)形参一:uint16_t data:
序号转换的整数(小端)返回参数:
转换后的网络字节序(大端)
2、将网络字节序转成十进制数字
uint16_t ntohs(uint16_t data)
函数功能:
大端转小端将short类型的整数转成主机字节序(小端)形参一:uint16_t data:
序号转换的整数(大端)返回参数:
转换后的网络字节序(小端)
三、IP字符串与网络字节序 C语言函数
- API涉及库 Linux网络编程 -
-
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
1、IP字符串转换成网络字节序
in_addr_t inet_addr(const char *cp)
函数功能:
将cp指向的IP字符串转成网络字节序
注意该函数不能识别255.255.255.255形参一:const char *cp:
需要转换参数的IP字符串返回参数:
成功返回 转换好的网络字节序
失败返回 INADDR_NONE
2、网络字节序转换成IP字符串
char *inet_ntoa(struct in_addr in)
函数功能:
将IP网络字节序转换成IP字符串
注意该函数不能识别255.255.255.255形参一:struct in_addr in
需要转换参数的 IP网络字节序返回参数:
成功返回 IP字符串首地址
失败返回 NULL
struct in_addr
{
//in_addr_t 一般为32位的unsigned int,其字节顺序为网络字节序,即该无符号数采用大端字节序。
in_addr_t s_addr;
};
表示一个32位的IPv4地址。
其中每8位表示一个IP地址中的一个数值。
四、字符串与整数 C语言函数
1、将字符串转换为int型整数
- API涉及库
#include <stdlib.h>
int atoi(const char *nptr)
函数功能:
将字符串转换为int型形参一:const char *nptr
需要转换参数的 字符串返回参数:
转换后的数值
//将字符串数转换为int整数
const char ch[] = "520";
int var = 0;
//赋值后 变量var = 520
var = atoi(ch);
//最终打印结果及为 520
printf("%d\n",var);
2、int型整数转换字符串
- API涉及库
#include <stdio.h>
int sprintf(char *str, const char *format, ...)
函数功能:
发送格式化输出到 str 所指向的字符串。
任意类型转换成字符串形参一:char *str
这是指向一个字符数组的指针,该数组存储了 C 字符串。
形参二:format
这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参中指定的值替换,并按需求进行格式化返回参数:
成功返回 写入的字符总数,不包括字符串追加在字符串末尾的空字符。
失败返回 一个负数。
//存放整数转换后的字符串
const char integer_buf[255];
int a = 100;
sprintf(integer_buf,"%d",a);
//存放浮点数转换后的字符串
const char floating_buf[255];
float b = 3.14;
sprintf(floating_buf,"%s",b);
//存放各自格式化转换后的字符串
const char temp_buf[255];
sprintf(temp_buf,"你好,世界!");
//最终打印结果
printf("integer_buf = %s\n",integer_buf);
printf("floating_buf= %s\n",floating_buf);
printf("temp_buf = %s\n",temp_buf);