网络编程中的字节序函数htonl()、htons()、ntohl()和ntohs()
目录
1,网络字节序和主机字节序
2. 函数的具体作用
2.1,htonl(Host to Network Long)
2.2,htons(Host to Network Short)
2.3,ntohl(Network to Host Long)
2.4,ntohs(Network to Host Short)
3,为什么需要这些函数?
4,适用范围
5,如何判断当前平台的字节序?
6,常见架构的字节序
1,网络字节序和主机字节序
-
网络字节序:
规定采用 大端字节序(Big Endian),即 高位字节存储在低地址,这是网络协议(如 TCP/IP)使用的标准。 -
主机字节序:
是指主机(计算机)的 CPU 如何存储多字节数据:- 大端字节序:高位字节存储在低地址。
- 小端字节序:低位字节存储在低地址(如 x86、x86_64)。
不同平台的字节序可能不同,因此在网络通信中必须统一使用网络字节序(大端)。
2. 函数的具体作用
2.1,htonl(Host to Network Long)
- 作用:将 32 位整数 从主机字节序转换为网络字节序(大端)。
- 函数原型:
uint32_t htonl(uint32_t hostlong);
- 示例:
uint32_t hostValue = 0x12345678; // 在小端机器上,内存中为 0x78 0x56 0x34 0x12
uint32_t networkValue = htonl(hostValue); // 转换为网络字节序:0x12 0x34 0x56 0x78
2.2,htons(Host to Network Short)
- 作用:将 16 位整数 从主机字节序转换为网络字节序(大端)。
- 函数原型:
uint16_t htons(uint16_t hostshort);
- 示例:
uint16_t hostValue = 0x1234; // 在小端机器上,内存中为 0x34 0x12
uint16_t networkValue = htons(hostValue); // 转换为网络字节序:0x12 0x34
2.3,ntohl(Network to Host Long)
- 作用:将 32 位整数 从网络字节序转换为主机字节序。
- 函数原型:
uint32_t ntohl(uint32_t netlong);
- 示例:
uint32_t networkValue = 0x78563412; // 假设收到的网络数据
uint32_t hostValue = ntohl(networkValue); // 转换为主机字节序(在小端机器上):0x12345678
2.4,ntohs(Network to Host Short)
- 作用:将 16 位整数 从网络字节序转换为主机字节序。
- 函数原型:
uint16_t ntohs(uint16_t netshort);
- 示例:
uint16_t networkValue = 0x3412; // 假设收到的网络数据
uint16_t hostValue = ntohs(networkValue); // 转换为主机字节序(在小端机器上):0x1234
3,为什么需要这些函数?
在网络通信中,主机之间可能使用不同的字节序。因此,发送方需要将数据转换为网络字节序,接收方需要将网络字节序转换回主机字节序。这些函数可以确保数据在网络上传输时的字节序是 一致的,从而避免因字节序不同导致的数据错误。
例如:
假设两个主机进行 UDP 通信,传输一个 32 位整数:
发送端(小端架构):
uint32_t data = 0x12345678;
uint32_t networkData = htonl(data); // 转换为大端
sendto(sockfd, &networkData, sizeof(networkData), 0, ...);
接收端(小端架构):
uint32_t receivedData;
recvfrom(sockfd, &receivedData, sizeof(receivedData), 0, ...);
uint32_t hostData = ntohl(receivedData); // 转换回小端
这样,无论发送端和接收端的架构如何,数据都可以正确传输和解析。
4,适用范围
| 函数 | 适用数据类型 | 转换方向 |
|---|---|---|
| htonl | 32 位整数 | 主机字节序 → 网络字节序 |
| htons | 16 位整数 | 主机字节序 → 网络字节序 |
| ntohl | 32 位整数 | 网络字节序 → 主机字节序 |
| ntohs | 16 位整数 | 网络字节序 → 主机字节序 |
5,如何判断当前平台的字节序?
#include <iostream>int main() {uint32_t num = 1;if (*(reinterpret_cast<uint8_t*>(&num)) == 1) {std::cout << "小端字节序" << std::endl;} else {std::cout << "大端字节序" << std::endl;}return 0;
}
- 如果输出 小端字节序,则当前主机使用 小端。
- 如果输出 大端字节序,则当前主机使用 大端。
6,常见架构的字节序
| 处理器架构 | 字节序 |
|---|---|
| x86、x86_64 | 小端 |
| ARM(大多数情况) | 小端 |
| PowerPC | 大端 |
| SPARC | 大端 |
相关文章:
网络编程中的字节序函数htonl()、htons()、ntohl()和ntohs()
目录 1,网络字节序和主机字节序 2. 函数的具体作用 2.1,htonl(Host to Network Long) 2.2,htons(Host to Network Short) 2.3,ntohl(Network to Host Long) 2.4,ntohs(Network to Host Sho…...
【dvwa靶场:File Upload系列】File Upload低-中-高级别,通关啦
目录 一、low级别,直接上传木马文件 1.1、准备一个木马文件 1.2、直接上传木马文件 1.3、访问木马链接 1.4、连接蚁剑 二、medium级别:抓包文件缀名 2.1、准备一个木马文件,修改后缀名为图片的后缀名 2.2、上传文件,打开burpSuite&…...
RHCE NFS
RHCE NFS 1.11. 2 NFS 主机名格式1.3 NFS 服务器配置1.3.1 /etc/exports 配置文件1.3.1.1 导出条目1.3.1.2 默认选项1.3.1.3 默认和覆盖选项 1.4 启动 NFS 服务器1.5 练习1.5.1 配置 NFS 服务器和客户端挂载1.5.2 配置autofs自动挂载(需要时才挂载) 1.6 …...
【数据结构】ArrayList与顺序表
ArrayList与顺序表 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 杨辉三角5.2 简单的洗牌算法 6. ArrayList的问题及思考 【本节目标】 线性表顺序表ArrayLis…...
互联网基础
TCP/IP协议(协议组) 分层名称TCP/IP协议应用层HTTP,FTP,mDNS,WebSocket,OSC...传输层TCP,UDP网络层IP链路层(网络接口层)Ethernet,Wi-Fi... 链路层(网络接口层) 链路层的主要作用…...
ffmpeg.js视频播放(转换)
chrome 临时设置SharedArrayBuffer "C:\Program Files\Google\Chrome\Application\chrome.exe" --enable-featuresSharedArrayBuffer 引用的js及相关文件 ffmpeg.min.js ffmpeg.min.js.map ffmpeg-core.js ffmpeg-core.wasm ffmpeg-core.worker.js 以上几个现…...
后端 Java发送邮件 JavaMail 模版 20241128测试可用
配置授权码 依赖 <dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version> </dependency> <dependency><groupId>com.sun.mail</groupId><artifa…...
电脑中的vcruntime140_1.dll文件有问题要怎么解决?一键修复vcruntime140_1.dll
遇到“vcruntime140_1.dll无法继续执行代码”的错误通常表明电脑中的vcruntime140_1.dll文件有问题。这个文件属于Visual C Redistributable,对很多程序的运行至关重要。本文将提供几个步骤,帮助你迅速修复这一错误,使电脑恢复正常工作状态。…...
探索 Vue 3.0中Treeshaking特性?
Vue 3.0 中的 Tree Shaking 特性 Tree Shaking 是一种优化技术,旨在通过静态分析代码,去除未使用的模块或函数,从而减小最终的打包文件大小。在 Vue 3.0 中,由于其模块化设计和代码按需引入的特性,Vue 的 Tree Shaking 特性得到了增强,能够有效地去除那些在生产环境中未…...
Paddle Inference部署推理(十)
十:Paddle Inference推理 (python)API详解 9. 启用内存优化 API定义如下: # 开启内存 / 显存复用,具体降低内存效果取决于模型结构 # 参数:None # 返回:None paddle.inference.Config.enable…...
万能门店小程序管理系统 doPageGetFormList SQL注入漏洞复现
0x01 产品简介 万能门店小程序管理系统是一款功能强大的工具,旨在为各行业商家提供线上线下融合的全方位解决方案。是一个集成了会员管理和会员营销两大核心功能的综合性平台。它支持多行业使用,通过后台一键切换版本,满足不同行业商家的个性化需求。该系统采用轻量后台,搭…...
全面+彻底解决VMware安装后没有VMnet1和VMnet8的问题
目录 1、摘要 (1)问题 (2)所用工具 ① Everything软件 ② CCleaner软件 2、问题的检查与确认 3、解决过程 (1)卸载已经安装的VMware (2)设置services.mcs:服务自…...
什么是堆?
堆(Heap):堆可以看做是一颗用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。 堆的特性 1.堆是完全二叉树,除了树的最后一层节点不需要是满的…...
微距动物和植物摄影后期森系风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 微距动物和植物摄影后期采用森系风格的 Lightroom 调色,将微距下的动植物世界打造成充满自然气息和梦幻感的画面。这种调色风格旨在突出动植物的细腻之美,同时营造出宁静、清新的森林氛围。 预设信息 调色风格:森系风格预设适合类…...
Qt6.8安卓Android开发环境配置
时隔多年,重拾QtCreator下Android开发。发现Qt6下安卓开发环境配置变简单不少!只需三步即可在QtCreator下进行Android开发: 一、使用Qt Mantenance Tool进行Android模块的安装: 如果感觉安装网速较慢,可以查看本人另外…...
RK3568部署yolo8记录
本教程记录自己一下在RK3568上部署yolo8的步骤 板端驱动 在板端,首先查看rknpu驱动是否安装、存在。若键入下面的命令有返回则,证明驱动已安装。 dmesg | grep -i rknpu 瑞芯微官方说,驱动版本最好大于0.9.2。但是我看有的博主说ÿ…...
数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy 编辑 3.使用DataFrame 编辑 二、绘制条形图(柱状图) 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…...
JavaScript原生深拷贝方法 structuredClone使用
structuredClone 简介 structuredClone 是现代浏览器提供的原生 JavaScript 方法,用于深拷贝对象。它可以处理各种复杂数据结构,包括嵌套对象、数组、Date、Map、Set 等,且支持循环引用。 语法 const clone structuredClone(value);value:…...
SpringBoot无法使用jkd8问题
1. 解决SpringBoot无法使用jdk8问题 创建一个高 jkd 版本,如 jkd21 在创建项目后,将 pom.xml中的 jdk 版本改为8,找到下图所在位置修改即可。 此外将 SpringBoot 的版本修改为 2 开头的 如2.7.4 ,然后 刷新 Maven 项目即可。 在 …...
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块
作者:来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中,我们将配置和使用 jina-embeddings-v2,这是第一个开源 8K 上下文长度嵌入模型,首先使用 semant…...
RTX 4090D深度学习镜像效果展示:PyTorch 2.8实测Wan2.2-T2V高清视频生成
RTX 4090D深度学习镜像效果展示:PyTorch 2.8实测Wan2.2-T2V高清视频生成 1. 开箱即用的专业级深度学习环境 当拿到这台搭载RTX 4090D显卡的工作站时,我首先被它的硬件配置震撼了。24GB显存加上120GB内存的组合,在本地运行大型视频生成模型不…...
Xilinx UltraScale的CLB黑科技:1个LUT当2个用的5种实战技巧(Vivado2023验证)
Xilinx UltraScale架构的CLB深度优化实战:5种高阶LUT拆分技巧 在FPGA设计领域,资源利用率与性能优化始终是工程师面临的核心挑战。Xilinx UltraScale架构通过创新的SliceM/SliceL结构设计,为硬件优化提供了前所未有的灵活性。本文将聚焦CLB中…...
Go网络编程nethttp包解析
Go语言凭借其简洁高效的特性,已成为现代网络编程的热门选择。其中,标准库中的net/http包为开发者提供了强大的HTTP服务端和客户端功能,极大简化了Web开发流程。本文将深入解析net/http包的核心特性,帮助开发者掌握构建高性能Web服…...
Comsol 模拟地下水井抽采与回灌:不同工况下的奇妙之旅
comsol地下水井抽采与回灌,井运行时间不连续,分粗沙,细沙以及粘土三种工况最近在研究地下水相关课题,用到 Comsol 模拟井抽采与回灌过程,发现其中不连续运行时间以及不同地质工况设置还挺有意思,今儿个来跟…...
Realistic Vision V5.1 虚拟摄影棚面试实战:解析Java八股文中的系统设计题
Realistic Vision V5.1 虚拟摄影棚面试实战:解析Java八股文中的系统设计题 最近在帮朋友准备后端开发的面试,发现一个挺有意思的现象。大家聊起Java八股文,尤其是系统设计题,总觉得有点枯燥,像是在背标准答案。什么“…...
OpenClaw长文本优化:Qwen3-32B-RTX4090D处理百万字小说的技巧
OpenClaw长文本优化:Qwen3-32B-RTX4090D处理百万字小说的技巧 1. 为什么选择Qwen3-32B处理长文本 当我第一次尝试用OpenClaw处理百万字小说时,遇到了两个致命问题:一是常规8K上下文窗口连完整章节都装不下,二是模型在长文本推理…...
Halcon 标定(Calibration)与引导(Guidance)的工业实践:从理论到高精度落地的全链路解析
1. Halcon标定技术的基础认知 第一次接触Halcon标定时,我和很多新手一样被那些专业术语吓到了。但真正用起来才发现,这套系统就像给机器装上了"眼睛和尺子"。简单来说,标定就是教会相机看懂真实世界的尺寸和位置。想象一下…...
nli-distilroberta-base详细步骤:自定义sentence-pair输入格式与JSON Schema定义
nli-distilroberta-base详细步骤:自定义sentence-pair输入格式与JSON Schema定义 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于分析句子对之间的逻辑关系。这个轻量级模型能够快速判断两个句子之间…...
Chatbox 连接火山引擎 ModelNotOpen 实战指南:从零搭建到生产环境部署
作为一名开发者,你是否也曾对构建一个能与自己实时对话的AI应用心驰神往?想象一下,一个能听懂你说话、理解你意图、并用自然声音回应你的数字伙伴。这听起来像是未来科技,但实际上,利用现有的强大工具,我们…...
NSSCTF题包(脱壳类和SMC)
题包里的这些类型的题这些已经接触了很长时间,但是仍然需要进行巩固,在这里先感谢师傅们还有胡楚昊大佬对我的帮助和支持这套题还有去花类的,前面文章讲过了脱壳类:主要应用的是自动脱壳以及ESP定律法手动脱壳ESP定律法࿱…...
