【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盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
