[c 语言] 大端,小端;网络序,主机序

在网络编程中,特别是底层网卡驱动开发时,常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序,高位保存在低地址还是高地址,以此来划分大端还是小端。

1 大端和小端

大端和小端指的是 cpu 的属性,常见的 intel 的 x86 cpu 是小端的,mips 架构的 cpu 是大端的。

 

假设有一个 int 类型的数据,值为 0x12345678,保存在地址 0x400 ~ 0x403 这 4 个字节的位置。

大端:

在大端 cpu 上,存储情况如下图所示,高位存储在低地址。0x12 是高位,存储在地址 0x400 上;0x78 是低位,存储才 0x403 上。

小端:

小端与大端相反,高位存储在高地址。0x12 是高位,存储在 0x403;0x78 是低位,存储在 0x400。

注:

(1)大端更符合我们直观的阅读顺序以及平时的习惯

(2)大端,小端,指的是字节序,大小端不同,字节存储顺序是不一样的。

大端,小端并不影响一个字节内部的 bit 的顺序。

对于一个字节的数据类型,比如 char,不受大端还是小端的影响。

(2)无论是大端序还是小端序,对于上边这个 int 类型的数据来书,这个数据的地址都是 0x400,即数据所在内存空间的低地址

如何判断大端还是小端 ?

如下代码可以判断大端还是小端,使用 union 数据结构的特点,union test 中有两个成员,一个是 char 类型,一个是 int 类型,union 占用 4 个字节,char 类型保存在 4 个字节的低地址。

如果 a 是 0x12,说明高位数据保存在了低地址,是大端;否则,是小端。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>int main() {union test {char a;int b;};union test t;t.b = 0x12345678;if (t.a == 0x12) {printf("大端\n");} else {printf("小端\n");}return 0;
}

程序编译之后运行,打印小端,与 lscpu 查看到的信息是一致的。

2 网络序和主机序

网络序与大端序是一致的,不管机器是大端的还是小端,发向网络的数据以及从网络中接收的数据都是大端的。大端,网络序与我们平时的思维习惯是一致的。

网络序规定,收到的数据的第一个字节是高位。在数据的发送侧是从低地址发送数据,接收侧先到来的数据也是存储在低地址。所以高位存储在低地址,网络序和大端是一致的。

主机序与 cpu 有关,可能是大端的,也可能是小端的。

3 转换函数

linux 下 的 <arpa/inet.h> 头文件中提供了 4 个函数。4 个函数中的 h 表示 host,主机序;n 表示 net,网络序;l 针对的是 u32 的数据;s 针对的是 u16 的数据。htonl 就是将 32 位的数据从主机序转化为网络序。

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>int main() {unsigned int a = 0x12345678;unsigned short b = 0x1234;printf("unsigned int 0x%x, host to net: 0x%x\n", a, htonl(a));printf("unsigned int 0x%x, net to host: 0x%x\n", a, ntohl(a));printf("unsigned short 0x%x, host to net: 0x%x\n", b, htons(b));printf("unsigned short 0x%x, net to host: 0x%x\n", b, ntohs(b));return 0;
}

怎么对 64 位数据进行字节序转换 ?

如下代码实现了 64 位数据的字节序转换。最容易出错的是函数的最后一行 return (unsigned long)(((unsigned long)net_low << 32) | net_high);,其中 net_low 需要使用 unsigned long 进行转换,否则会发生数据丢失。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>unsigned long htonll(unsigned long host_ul) {unsigned int host_ul_low = host_ul & 0x00000000ffffffff;unsigned int host_ul_high = host_ul >> 32;printf("1, low = 0x%x, high = 0x%x\n", host_ul_low, host_ul_high);unsigned int net_low = htonl(host_ul_low);unsigned int net_high = htonl(host_ul_high);printf("2, low = 0x%x, high = 0x%x\n", net_low, net_high);return (unsigned long)(((unsigned long)net_low << 32) | net_high);
}int main() {unsigned long a = 0x1122334455667788;printf("0x%llx\n", htonll(a));return 0;
}

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/703974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulhub 靶场训练 DC-9解析

一、搭建环境 kali的IP地址是&#xff1a;192.168.200.14 DC-9的IP地址暂时未知 二、信息收集 1、探索同网段下存活的主机 arp-scan -l #2、探索开放的端口 开启端口有&#xff1a;80和22端口 3、目录扫描 访问80 端口显示的主页面 分别点击其他几个页面 可以看到是用户…

SpringBoot源码解读与原理分析(三十四)SpringBoot整合JDBC(三)声明式事务的传播行为控制

文章目录 前言10.5 声明式事务的传播行为控制10.5.1 修改测试代码&#xff08;1&#xff09;新建一个Service类&#xff0c;并引用UserService&#xff08;2&#xff09;修改主启动类 10.5.2 PROPAGATION_REQUIRED10.5.2.1 tm.getTransaction&#xff08;1&#xff09;获取事务…

用于自监督视觉预训练的屏蔽特征预测

Masked Feature Prediction for Self-Supervised Visual Pre-Training 一、摘要 提出了用于视频模型自监督预训练的掩模特征预测&#xff08;MaskFeat&#xff09;。首先随机屏蔽输入序列的一部分&#xff0c;然后预测屏蔽区域的特征。研究了五种不同类型的特征&#xff0c;发…

遥感、航拍、影像等用于深度学习的数据集集合

遥感图像的纹理特征异常繁杂&#xff0c;地貌类型多变&#xff0c;人工提取往往存在特征提取困难和特征提取不准确的问题&#xff0c;同时&#xff0c;在这个过程中还会耗费海量的人力物力。随着计算力的突破、数据洪流的暴发和算法的不断创新&#xff0c;在具有鲜明“大数据”…

ffmpeg的pcm、yuv小知识点

ffmpeg的pcm、yuv小知识点 pcm、yuv保存调用&#xff0c;写个通用工具方法&#xff0c;平时快速保存&#xff0c;和调用方便查看自己bug ffmpeg的AVFrame存储 yuv 调用方法 保存方法 void save_yuv420p_file(unsigned char *y_buf , unsigned char *u_buf,unsigned char *…

git commit 后,本地远端都没有记录,消失不见

今天git commit 之后发现远端没有记录&#xff0c;本地没有最新代码记录 git commit 后&#xff0c;提交记录会消失不见的原因可能是&#xff1a; git只git commit了&#xff0c;没有push到远程分支&#xff0c;切换到其他分支时丢失。而且看不到提交记录&#xff0c;和找不到…

2024.2.21 模拟实现 RabbitMQ —— 实现转发规则

目录 需求分析 直接交换机&#xff08;Direct &#xff09; 主题交换机&#xff08;Topic &#xff09; 扇出交换机&#xff08;Fanout &#xff09; Topic 交换机转发规则 routingKey 组成 bindingKey 组成 匹配规则 情况一 情况二 情况三 实现 Router 类 校验 b…

Spring Boot application.properties和application.yml文件的配置

在Spring Boot中&#xff0c;application.properties 和 application.yml 文件用于配置应用程序的各个方面&#xff0c;如服务器端口、数据库连接、日志级别等。这两个文件是Spring Boot的配置文件&#xff0c;位于 src/main/resources 目录下。 application.properties 示例 …

vue中动态表格中文校验,但是中文的参数无法获取

场景&#xff1a; 解决方案&#xff1a; 因为上述的正则表达式后&#xff0c;使用搜狗输入法没有问题&#xff0c;但采用微软自带输入法后&#xff0c;会存在输入数字及英文时为正常&#xff0c;切换为汉字后&#xff0c;会存在吞并当前光标前的字符。具体吞并个数和输入法中有…

Unity发布webgl获取浏览器的URL

Unity发布webgl获取浏览器的URL Unity发布webgl之后获取浏览器的url 在unity中创建文件夹Plugins&#xff0c;然后添加添加文件UnityGetBrowserURL.jslib var GetUrlFunc {//获取地址栏的URLStringReturnValueFunction: function () {var returnStr window.top.location.hre…

SpringBoot3整合Swagger3,访问出现404错误问题(未解决)

秉承着能用就用新的的理念&#xff0c;在JDK、SpringBoot、SpringCloud版本的兼容性下&#xff0c;选择了Java17、SpringBoot3.0.2整合Swagger3。 代码编译一切正常&#xff0c;Swagger的Bean也能加载&#xff0c;到了最后访问前端页面swagger-ui的时候出现404。 根据网上资料…

Oracle ADG相关介绍

文章目录 一、ADG原理1、ADG介绍2、ADG搭建流程 二、ADG相关参数三、增量修复 一、ADG原理 1、ADG介绍 Oracle ADG&#xff08;Advanced Data Guard&#xff09;是Oracle数据库的一项高可用和灾难恢复技术&#xff0c;它通过将数据保持在物理备库中来提供数据保护和容灾能力。…

StringBuffer StringBuilder

String 为什么StringBuilder是线程不安全的&#xff1f;StringBuffer是线程安全的&#xff1f; - Jacian - 博客园 (cnblogs.com) StringBuilder 线程安全的可变字符学序列 速度快 StringBuffer 线程不安全的可变字符序列 创建StringBuilder对象 new StringBuilder&…

c++面试一

1.#include使用 在C/C中&#xff0c;#include 预处理指令用于包含头文件&#xff0c;这些头文件通常包含了函数声明、宏定义以及其他的声明和定义。#include 指令后面跟着的文件名可以使用双引号 "" 或尖括号 <> 来指定&#xff0c;它们之间有一些区别。 双引…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

设计并实现一个并发安全的LRU(Least Recently Used,最近最少使用)缓存结构

文章目录 前言实战演示写在最后 前言 相信很多人都使用过LinkedHashMap&#xff0c;LinkedHashMap中的removeEldestEntry可以删除老旧的元素&#xff0c;我们可以以此来实现一个LRU缓存结构&#xff0c;并结合java中JUC包中的各种多线程锁机制来保证多线程安全。 以下是我遇见…

【前端素材】推荐优质后台管理系统Dashmin平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 后台管理系统是一种具有多层次结构的软件系统&#xf…

邀请函 | 2024年数据技术嘉年华集结号已吹响,期待您参会!

龙腾四海内&#xff0c;风云际会时&#xff0c;2024年中国数据嘉年华如约而至。从起初小范围的网友聚会&#xff0c;到如今面向全国各地从业者、爱好者的年度集会&#xff0c;纵使岁月更迭&#xff0c;我们初心依旧。我们在各自最好的年华里共同见证了中国数据库行业的蓬勃发展…

Linux下的IO多路复用

文章目录 一. IO的概念和分类1. IO操作的原理&#xff1a;二. I/O多路复用使用场景和作用1. 问题&#xff1a; 一台网络服务器需要接收100台客户端的连接和数据通信&#xff0c;应该如何设计和实现&#xff1f;2. I/O多路复用机制&#xff1a; 三. Select poll epollselectpoll…

【前端素材】推荐优质后台管理系统Modernize平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和控制网站、应用程序或系统后台操作的软件工具&#xff0c;通常由授权用户&#xff08;如管理员、编辑人员等&#xff09;使用。它提供了一种用户友好的方式来管理网站或应用程序的内容、用户、数据等方面的操作&#xff0c;并且通常…