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

news2025/2/25 11:59:55

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

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.coloradmin.cn/o/1473913.html

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

相关文章

视频如何无水印保存?这两个方法帮你一键保存

在互联网的浩瀚海洋中&#xff0c;我们时常会遇到那些令人心动、想要珍藏的视频。无论是教育资料、精彩瞬间&#xff0c;还是心仪的影片、综艺节目&#xff0c;我们都希望能够随时随地欣赏它们。然而&#xff0c;网络上的视频往往受到地域、平台、设备等多种限制&#xff0c;使…

数组指针。

数组指针&#xff1a;*先与数组名结合&#xff0c;后与方块结合。 指针数组&#xff1a;*先与方块结合。 int(*p)[5]和&arr的类型均为int(*)[5] &arr取出的是数组整个地址。&arr[0]与arr相同&#xff0c;是数组首地址。 一般在二维数组中使用数组指针 打印时要写…

StarRocks实战——多维分析场景与落地实践

目录 一、OLAP 系统历史背景 1.1 历史背景与痛点 1.2 组件诉求 二、StarRocks 的特点和优势 2.1 极致的查询性能 2.2 丰富的导入方式 2.3 StarRocks 的优势特点 三、多维分析的运用场景 3.1 实时计算场景 / 家长监控中心 3.2 实时更新模型选择 3.2.1 更新模型UNIQU…

动态规划的时间复杂度优化

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 优化动态规划的时间复杂度&#xff0c;主要有如下几种&#xff1a; 一&#xff0c;不同的状态表示。 比如&#xff1a;n个人&#xff0c;m顶帽子。 第一种方式&#xff1a;dp[i][mask] ,i表示前i个人已经选择帽子&…

安防视频监控平台EasyNVR级联视频上云管理平台EasyNVS,出现报错“i/o deadline reached”该如何解决?

上云网关管理平台EasyNVS视频综合管理系统具备汇聚与管理EasyGBS、EasyNVR等平台的能力&#xff0c;系统可以将接入的视频资源实现视频能力统一输出&#xff0c;并能进行远程可视化运维等管理功能&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反…

【数据结构】栈OJ题《用栈实现队列》(题库+解析+代码)

1. 前言 通过前面栈的实现和详解大家对队列应该有一定熟悉了&#xff0c;现在上强度开始做题吧 栈详解&#xff1a;http://t.csdnimg.cn/9Fsbs 本体的做题思路也可以参考上一篇文章&#xff0c;就是有一点点不同。 用队列实现栈&#xff1a;http://t.csdnimg.cn/V2qjW 2. …

Connection模块类功能联调(整合三)

目录 概要 tcp_cli.cc tcp_srv.cc server.hpp 测试结果 第三次整合 概要 本主要是将以下模块进行整合测试 Connection管理类实现(模块六)-CSDN博客 EventLoop整合与TimerWheel联合调试(整合二)-CSDN博客 tcp_cli.cc #include "../source/server.hpp"int main…

大开眼界的4款黑科技软件,功能强大,网友:越用越上瘾

作为一名热衷于探索软件的搞机爱好者&#xff0c;小蛙在各大软件论坛间游走&#xff0c;旨在帮助大家在纷繁复杂的Windows软件世界中&#xff0c;寻找到那些真正值得安装的神器。 在忙碌的现代生活中&#xff0c;我们的磁盘空间和时间都显得尤为宝贵&#xff0c;没必要下一些鸡…

web网站怎么做压力测试

Web网站性能体现在并发用户数已经网站的吞吐量和时延。 最简单的压力测试工具就是ab "Apache Benchmark" 下面将介绍ab的安装和使用&#xff1a; 1. ab的安装 ab的安装非常简单&#xff0c;安装了httpd&#xff0c;就自带ab。 CentOS下的安装: yum install -y httpd …

docker 常用指令(启动,关闭,查看运行状态)

文章目录 docker 常用指令启动 docker关闭 docker查看 docker的运行状态 docker 常用指令 启动 docker systemctl start docker关闭 docker systemctl stop docker查看 docker的运行状态 systemctl status docker如下图所示&#xff1a; 表示docker正在运行中

云呐智能生产线安装与运维是做什么的?需要学哪些内容?

能生产线安装与运维主要负责智能化生产线的组装、接线、调试、辅助生产和运维等工作。  智能生产线安装与运维工作的核心在于保证智能生产线的高效运转和持续优化。具体来说&#xff0c;这个领域的工作人员需要掌握机械、电工电子技术、工业机器人等基础知识和技能&#xff0…

如何进行Appium实现移动端UI自动化测试?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学…

亚信安慧AntDB助力全链路实时化

实时数据平台&#xff0c;快速实现企业全链路实时化 引入数据仓库、数据挖掘、HTAP等先进理念&#xff0c;通过实时数据应用平台来装载庞大的信息量&#xff0c;进行实时分析处理&#xff0c;克服数据处理过程中的困难&#xff0c;是当下各企事业单位、互联网、金融&#xff0c…

学习pybind11:Hello World例子

首先要明白pybind11是干啥的&#xff0c;对于一个C/C库&#xff0c;可以用pybind11封装它的接口为Python接口&#xff0c;这样得到一个python库&#xff0c;就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此&#xff0c;使用pybind11做封装&#xff0c;是我…

Golang 实现 websocket 通讯(一个服务器,两个客户端)

运行客户端时首先要输入自己的名字&#xff0c;两个客户端输入的名字不能一样。 先上运行结果&#xff1a; 服务器端&#xff1a; 客户端1&#xff1a; 客户端2&#xff1a; 话不多说&#xff0c;直接上代码&#xff1a; 服务器端&#xff1a; package mainimport ("f…

计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )

文章目录 停等协议的弊端后退N帧协议中的滑动窗口GBN发送方必须响应的三件事GBN接受方要做的事运行中的GBN滑动窗口长度GBN协议重点总结习题1习题2GBN协议性能分析小结 停等协议的弊端 信道利用率低&#xff1a;在停等协议中&#xff0c;发送方在发送完一帧后必须等待接收方确…

教师编制取消?什么时候执行?

有关教师编制取消的传闻在教育界和社交媒体上闹得沸沸扬扬。许多老师、家长、学生都对此表示了极大的关注。教师编制真的会取消吗&#xff1f;如果取消&#xff0c;又将在何时执行&#xff1f; 教师编制&#xff0c;作为一种职业保障和身份&#xff0c;在很长一段时间内被视为教…

利用 ChatGPT 提升个人工作、生活品质

利用 ChatGPT 提升个人工作、生活品质和个人智慧是一个多方面而又切实可行的方法。 以下是一些具体的建议&#xff1a; 获取信息和知识&#xff1a; ChatGPT 可以回答各种问题并提供相关信息和知识。你可以利用它来查询工作中遇到的问题、学习新的知识领域或是获取日常生活中的…

Python进阶:Pandas -- 清理重复数据

Python进阶&#xff1a;Pandas – 清理重复数据 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持…

11.vue学习笔记(组件生命周期+生命周期应用+动态组件+组件保持存活)

文章目录 1.组件生命周期2.生命周期应用2.1通过ref获取元素DOM结构2.2.模拟网络请求渲染数据 3.动态组件3.1.A&#xff0c;B两个组件 4.组件保持存活&#xff08;销毁期&#xff09; 1.组件生命周期 每个Vue组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置…