【C语言】网络字节序和主机字节序
网络字节序和主机字节序是计算机中字节的两种排序方式,它们主要用于解决不同计算机之间数据通信的问题。
一、网络字节序
也被称为大端字节序,是一种标准的字节序。在网络通信中,如果两台主机的字节序不同,可能会导致数据解释的二义性。为了避免这种问题,网络字节序被采用。无论主机使用什么字节序,发送到网络中的数据都是网络字节序,接收方可以根据自己的主机字节序进行转换。这样,无论接收方使用什么字节序,都能正确地解释数据。
二、主机字节序
常为小端字节序,是每台计算机根据其硬件设计所采用的字节序。不同的计算机主机字节序可能不相同,与CPU设计有关。这导致了在存储单元超过一个字节的数据时,需要使用网络字节序进行通信,以避免兼容性问题。
三、网络字节序和主机字节序的示例
假设我们有一个32位的整数0x12345678。
- 在主机字节序中,这个整数的存储方式取决于主机的字节序规则。在大端(Big-Endian)系
统中,高位字节存储在低地址处,低位字节存储在高地址处。因此,0x12345678在大端系统中的存储顺序是0x12 0x34 0x56 0x78。而在小端(Little-Endian)系统中,低位字节存储在低地址处,高位字节存储在高地址处。所以,0x12345678在小端系统中的存储顺序是0x78 0x56 0x34 0x12。
- 在网络字节序中,采用的是大端(Big-Endian)字节序。因此,无论主机使用的是什么字节序规则,发送到网络上的数据都必须转换成网络字节序。在这个例子中,我们要发送的整数0x12345678在网络字节序中的表示就是0x12 0x34 0x56 0x78。
在实际编程中,我们通常会使用一些函数如htons, htonl, htonll,
ntohs, ntohl,ntohll
等来进行主机字节序和网络字节序之间的转换。
四、编程示例
下面是一个使用C语言编写的示例,演示了如何在网络字节序和主机字节序之间进行转换。
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h> int main() { uint32_t host_int = 0x12345678; // 假设主机字节序为Little-Endian uint32_t net_int; uint32_t converted_host_int; // 将主机字节序转换为网络字节序 net_int = htonl(host_int); printf("Host byte order: 0x%X\n", host_int); printf("Network byte order: 0x%X\n", net_int); // 将网络字节序转换回主机字节序 converted_host_int = ntohl(net_int); printf("Converted back to host byte order: 0x%X\n", converted_host_int); return 0;
}
上面的示例中,我们使用了两个函数:htonl
和ntohl
。htonl
函数用于将32位主机字节序整数转换为网络字节序,而ntohl
函数则执行相反的操作。这两个函数都在头文件<arpa/inet.h>
中定义。对于16位整数,可以使用htons
和ntohs
函数。64位整数,可以使用htonll和ntohll
函数。这些函数在处理IP地址和端口号时非常有用,因为IP地址和端口号在网络传输时需要使用网络字节序。
编程示例中,主机字节序转换为网络字节序函数相当于:
void int2bytes( unsigned int v, unsigned char *str )
{str[0] = (v>>24)&0xFF;str[1] = (v>>16)&0xFF;str[2] = (v>>8)&0xFF;str[3] = (v)&0xFF;
}
网络字节序转换为主机字节序函数相当于:
unsigned int bytes2int(unsigned char *str)
{unsigned int data;data = ((*str) << 24) | ((*(str+1))<<16) | ( (*(str+2))<<8 ) | (*(str+3));return data;
}
请注意,示例中的主机字节序假设为小端字节序(Little-Endian)。如果主机实际上使用大端字节序(Big-Endian),则网络字节序和主机字节序将是相同的,因此这些转换函数在这种情况下不会执行任何操作。
五、总结
网络字节序和主机字节序的主要区别在于使用场景:网络字节序主要用于网络通信中保证数据的正确性,而主机字节序则是每台计算机根据其硬件设计所采用的字节序。
在跨平台通信中,为了确保数据的一致性,通常会使用网络字节序来进行数据的传输和存储。然而,在某些情况下,为了更好地利用硬件的性能,可能会选择使用主机字节序。
相关文章:

【C语言】网络字节序和主机字节序
网络字节序和主机字节序是计算机中字节的两种排序方式,它们主要用于解决不同计算机之间数据通信的问题。 一、网络字节序 也被称为大端字节序,是一种标准的字节序。在网络通信中,如果两台主机的字节序不同,可能会导致数据解释的二…...

极简模式,助力宏观数据监控
随着UWA GOT Online采样的参数越来越多样化,为了提升开发者的使用体验,我们最新推出了三种预设数据采集方案:极简模式、CPU模式、内存模式。该更新旨在降低多数据采集对数据准确性的干扰,同时也为大家提供更精准且有针对性的数据指…...

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…...

IT圈的“鄙视链”大揭秘:从Java到Go,编程语言之战!
目录 编辑 Java程序员: 自信满满的领头羊 C语言程序员: 严肃的技术守护者 汇编语言程序员: 古老的传承者 Go语言程序员: 新晋的潜力股 结语: 编程语言,相互鄙视中求共存 我的其他博客 在IT圈…...
【C++】算法库(复制操作、交换操作、变换操作)
C算法库 文章目录 C算法库复制操作copy , copy_ifcopy_ncopy_backward 交换操作swapswap_rangesiter_swap 变换操作transformreplacereplace_copy replace_copy_if 算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操…...

CV计算机视觉每日开源代码Paper with code速览-2023.12.6
点击计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构:Transformer】Rejuvenating image-GPT as Strong Visual Representation Learners 论文地址:https://a…...
面试经典150题(1-2)
leetcode 150道题 计划花两个月时候刷完,今天完成了两道(1-2)150: (88. 合并两个有序数组)题目描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 n…...

MySQL使用教程
数据构成了我们日益数字化的社会基础。想象一下,从移动应用和银行系统到搜索引擎,再到如 ChatGPT 这样的先进人工智能聊天机器人,这些工具若没有数据支撑,将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢?答案正…...
微服务学习:Ribbon实现客户端负载均衡,将请求分发到多个服务提供者
Ribbon是Netflix开源的一个基于HTTP和TCP客户端负载均衡器。它主要用于在微服务架构中实现客户端负载均衡,将请求分发到多个服务提供者上,从而实现高可用性和扩展性。 Ribbon的主要特点包括: 客户端负载均衡:Ribbon是一个客户端负…...

孩子还是有一颗网安梦——Bandit通关教程:Level0
🕵️♂️ 专栏《解密游戏-Bandit》 🌐 游戏官网: Bandit游戏 🎮 游戏简介: Bandit游戏专为网络安全初学者设计,通过一系列级别挑战玩家,从Level0开始,逐步学习基础命令行和安全概念…...
读excel文件,借助openpyxl工具
读excel文件,借助openpyxl工具 import osimport requestsos.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"base_url "https://testnet.starscan.io/explore…...

ubuntu16.04升级openssl
Ubuntu16.04 默认带的openssl版本为1.0.2 查看:openssl version 1.下载openssl wget https://www.openssl.org/source/openssl-1.1.1.tar.gz 编译安装 tar xvf openssl-1.1.1.tar.gz cd openssl-1.1.1 ./config make sudo make install sudo ldconfig 删除旧版本 su…...
【力扣100】56.合并区间
添加链接描述 class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# 队列,每次加进来两个元素:1.不包含:第一个元素出去,并放入result;2.包含:合并nlen(intervals)result…...

重磅!2023中国高校计算机大赛-人工智能创意赛结果出炉
目录 中国计算机大赛-人工智能创意赛现场C4-AI大赛颁奖及留影800个AI应用?这届大学生真能“搞事情”AI原生时代,百度要再培养500万大模型人才 中国计算机大赛-人工智能创意赛现场 12月8日,杭州,一位“白发老人”突然摔倒在地&…...

[Linux] 用LNMP网站框架搭建论坛
一、nginx在其中工作原理 原理: php-fpm.conf是控制php-fpm守护进程 它是php.ini是一个php解析器 工作过程: 1.当客户端通过域名请求访问时,Nginx会找到对应的虚拟主机 2. Nginx将确定请求。 对于静态请求,Nginx会自行处理…...

记录 | 使用samba将ubuntu文件夹映射到windows实现共享文件夹
一、ubuntu配置 1. 安装 samba samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议。 sudo apt-…...

leetcode 股票DP系列 总结篇
121. 买卖股票的最佳时机 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 只能进行一次交易 很简单,只需边遍历边记录最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …...
深入理解Java虚拟机---对象的创建和内存异常溢出
深入理解Java虚拟机---对象的创建和内存异常溢出 对象的创建对象内存布局对象的访问定位内存溢出Java堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本地直接内存溢出 对象的创建 Step1:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是…...

windows MYSQL解决中文乱码问题
1.首先确保你已经把mysql配置了环境变量 2.打开window终端 3.输入mysql -u root -p 4.输入密码,就是安装的时候设置的root超级管理员权限密码 5.输入: SHOW VARIABLES LIKE ‘character%’; 出现上图,说明就会出现中文乱码问题。 6.该怎么办…...

EasyRecovery2024免费永久版手机数据恢复软件
EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...