C++学习笔记(50)

343、主机字节序与网络字节序

一、大端序/小端序

如果数据类型占用的内存空间大于 1 字节,CPU 把数据存放在内存中的方式有两种:

 大端序(Big Endian):低位字节存放在高位,高位字节存放在低位。

 小端序(Little Endia):低位字节存放在低位,高位字节存放在高位。

假设从内存地址 0x00000001 处开始存储十六进制数 0x12345678,那么:

Bit-endian(按原来顺序存储)

0x00000001 0x12

0x00000002 0x34

0x00000003 0x56

0x00000004 0x78

Little-endian(颠倒顺序储存)

0x00000001 0x78

0x00000002 0x56

0x00000003 0x34

0x00000004 0x12

Intel 系列的 CPU 以小端序方式保存数据,其它型号的 CPU 不一定。

操作文件的本质是把内存中的数据写入磁盘,在网络编程中,传输数据的本质也是把数据写入文件

(socket 也是文件描述符)。

这样的话,字节序不同的计算机之间传输数据,可能会出现问题。 二、网络字节序

为了解决不同字节序的计算机之间传输数据的问题,约定采用网络字节序(大端序)。

C 语言提供了四个库函数,用于在主机字节序和网络字节序之间转换:

uint16_t h to n s(uint16_t hostshort); // uint16_t 2 字节的整数 unsigned short

uint32_t htonl(uint32_t hostlong); // uint32_t 4 字节的整数 unsigned int

uint16_t ntohs(uint16_t netshort);

uint32_t n to h l(uint32_t netlong);

h host(主机);

to 转换;

n network(网络);

s short(2 字节,16 位的整数);

l long(4 字节,32 位的整数);

相关推荐
唐诺1 小时前
几种广泛使用的 C++ 编译器
c++·编译器
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__2 小时前
Web APIs学习 (操作DOM BOM)
学习
冷眼看人间恩怨2 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客3 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin3 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos4 小时前
c++---------数据类型
java·jvm·c++
数据的世界014 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐5 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
十年一梦实验室5 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵