lv7 嵌入式开发-网络编程开发 05 字节序及IP地址转换

news2024/12/27 13:48:12

目录

1 主机字节序和网络字节序

1.1 什么是字节序?

1.2 查看主机字节序

2 字节序转换函数

3 IP地址字节序转换函数

 4 练习


1 主机字节序和网络字节序

1.1 什么是字节序?

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序,分为:

大端字节序 (Big endian)

小端字节序(Little endian)

示例: 0x11223344

一般主机当中使用小端字节序(因为涉及运算,先算低位再算高位)

网络通信当中必须使用大端字节序 (因为读起来方便,因为先读高位,再读低位)

1.2 查看主机字节序

uint32_t val32 = 0x11223344;
uint8_t val8 = *( (uint8_t *)&val32 );
if(val8 == 0x44)
	printf("本机是小端字节序\n");
else
	printf("本机是大端字节序\n");
  • 定义了一个无符号32位整型变量val32,并且初始化为0x11223344
  • 定义一个8位的无符号整型变量val8,并且将强转以后的val32的数据赋值给val8
  • 这样做的目的是获取变量val32第一个字节的值,后面就可通过判断val8的值是0x44或者0x11来确定主机字节序是大端还是小端 

ubuntu示例

#include <stdio.h>
 
int main(int argc, char *argv[])
{
    unsigned int val32 = 0x11223344;
    unsigned char val8 = *((unsigned char *)(&val32));
    if(val8 == 0x44)
        printf("本机是小端字节序\n");
    else
        printf("本机是大端字节序\n");
    return 0;
}

2 字节序转换函数

 

//头文件
#include <arpa/inet.h>
//字节序转换函数
       uint32_t htonl(uint32_t hostlong);
       uint16_t htons(uint16_t hostshort);
       uint32_t ntohl(uint32_t netlong);
       uint16_t ntohs(uint16_t netshort);

 字节序转换函数

3 IP地址字节序转换函数

  • IP地址可能会存在“点分十进制”的字符串形式,转换之前需要注意
  • 主机字节序一般采用小端字节序
  • 网络字节序转主机字节序以后通常需要转换成“点分十进制”的字符串
//字符串转32位数据
#include <arpa/inet.h>

//IP地址序转换函数

//将一个点分十进制的IPv4地址转换为一个32位的网络字节序的整数表示。
      in_addr_t inet_addr(const char *cp); 

//将一个点分十进制的IPv4地址转换为一个32位的网络字节序的整数,并存储到struct in_addr类型的结构体中。
      int inet_aton(const char *cp, struct in_addr *addr);

//将一个点分十进制的IPv4或IPv6地址转换为对应地址族的二进制格式,并存储到指定的内存空间中。
      int inet_pton(int af, const char *cp, void *addr);

//将一个32位的网络字节序的整数表示的IPv4地址,转换为以点分十进制表示的字符串形式。
      char* inet_ntoa(struct in_addr in);

//将一个二进制格式的IPv4或IPv6地址转换为相应的点分十进制字符串形式,并存储到指定的内存空间中。
      int inet_ntop(int af, const void *addr, char *cp);
//支持IPV6的地址转换函数
#include <arpa/inet.h>
//IP地址序转换函数
      int inet_pton(int af, const char *cp, void *addr);
      int inet_ntop(int af, const void *addr, char *cp);

 4 练习

请简要总结网络字节序形成的原因,以及网络编程中对应的处理方法。

一般主机当中使用小端字节序(因为涉及运算,先算低位再算高位)

网络通信当中必须使用大端字节序 (因为读起来方便,因为先读高位,再读低位)

使用网络字节序可以确保数据在不同设备之间正确地传递。

htonl() 和 ntohl():32位 这两个函数用于在主机字节序和网络字节序之间进行转换。

htons() 和 ntohs():16位 这两个函数用于在主机字节序和网络字节序之间进行转换。

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

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

相关文章

Qt creator+cmake编译并安装

1、qt creator打开项目中的CMakeLists.txt 2、修改“构建设置“-“Cmake”-”Current Configuration“&#xff0c;其中&#xff0c;安装路径为CMAKE_INSTALL_PREFIX 3、修改“构建设置“-“构建的步骤”-”目标“&#xff0c;勾选"all"和"install" 4、构…

acwing198反素数(题解)

对于任何正整数 x&#xff0c;其约数的个数记作 g(x)&#xff0c;例如 g(1)1、g(6)4&#xfffd;(1)1、&#xfffd;(6)4。 如果某个正整数 x满足&#xff1a;对于任意的小于 x 的正整数 i&#xff0c;都有 g(x)>g(i)&#xff0c;则称 x为反素数。 例如&#xff0c;整数 1…

孔雀东南飞:经济高质量发展与人才流动(数据复现)

数据简介&#xff1a;人才是经济高质量发展的动力源泉。中国ZF一直高度重视人才培养&#xff0c;积极发挥人才作用。“人才是第一资源”,“深入实施……人才强国战略”,“坚持……人才引领驱动”。与此同时&#xff0c;地方ZF大力引进人才&#xff0c;不断推出各类人才优待政策…

提升您的工作效率:TechSmith Snagit for Mac:强大的屏幕截图软件

在当今数字化的时代&#xff0c;屏幕截图已成为我们日常生活和工作中必不可少的一部分。无论是为了保存重要的信息、分享有趣的内容&#xff0c;还是为了制作教程和演示文稿&#xff0c;一款优秀的屏幕截图软件都能极大地提升我们的效率。而在所有的屏幕截图软件中&#xff0c;…

开源python双屏图片浏览器软件

源代码 需要安装pyqt5这个库 # -*- coding: utf-8 -*-from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QPushButton, QFileDialog, QAction, QSlider, QHBoxLayout, QWidget from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt, QS…

UWB高精度定位系统:引领精准定位技术的新纪元

在现代社会中&#xff0c;精准定位技术对于各行各业都至关重要。为了满足对高精度定位的需求&#xff0c;超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术应运而生。UWB高精度定位系统以其出色的定位精度和多样化的应用领域而备受关注。本文将深入探讨UWB高精度定位系统…

国庆day5---QT实现TCP服务器客户端搭建的代码,现象

ser.h #ifndef SER_H #define SER_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QMessageBox> //消息对话框 #include<QList> //链表头文件QT_BEGIN_NAMESPACE nam…

pycharm中添加固定的作者的信息

一. pycharm中添加作者信息,日期,等 如图所示 里面还可以添加一些固定的信息 #专业 计算机科学与技术 #姓名 小明

Java泛型理解

什么是泛型&#xff1f; 我们都知道 Java 中有形参和实参之分&#xff0c;是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数&#xff0c;其本身没有确定的值。在调用函数时&#xff0c;实参将赋值给形参。 而泛型是一种参数化的类型&#xff08…

【云备份】

文章目录 [toc] 1 :peach:云备份的认识:peach:1.1 :apple:功能了解:apple:1.2 :apple:实现目标:apple:1.3 :apple:服务端程序负责功能:apple:1.4 :apple:服务端功能模块划分:apple:1.5 :apple:客户端程序负责功能:apple:1.6 :apple:客户端功能模块划分:apple: 2 :peach:环境搭建…

Cocos Creator3.8 实战问题(四)巧用九宫格图像拉伸

一、为什么要使用九宫格图像拉伸 相信做过前端的同学都知道&#xff0c;ui &#xff08;图片&#xff09;资源对包体大小和内存都有非常直接的影响。 通常ui 资源都是图片&#xff0c;也是最占资源量的资源类型&#xff0c;游戏中的ui 资源还是人机交互的最重要的部分&#xff…

【Java】main方法的深入理解

目录 深入理解 main 方法 public static void main(String[] args) ​编辑示例代码&#xff1a; 编译运行&#xff08;String[] args&#xff09;&#xff1a; main 方法的注意事项 示例代码&#xff1a; 深入理解 main 方法 public static void main(String[] args) mai…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

基于Java的火车高铁订票购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

PowerShell 内网不能直接安装SqlServer模块的处理办法

PowerShell 内网不能直接安装SqlServer模块的处理办法 文章目录 下载sqlserver module安装sqlserver module导入和验证sqlserver 模块推荐阅读 下载sqlserver module 首先先将sqlserver.nupkg下载到本地&#xff0c;我是放到了C:\windows\system32目录下。 PowerShell Galler…

2023年【电工(初级)】最新解析及电工(初级)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;最新解析是安全生产模拟考试一点通总题库中生成的一套电工&#xff08;初级&#xff09;新版试题&#xff0c;安全生产模拟考试一点通上电工&#xff08;初级&#xff09;作业手机同…

采访|使用过ChatGPT的同学在与人工智能对话后的体验

“我能够回答各种问题&#xff0c;包括但不限于有关互联网、科技、娱乐、教育等领域的知识。我不会感到疲倦或分心&#xff0c;也没有情绪或偏见。”这是ChatGPT对自己的描述。ChatGPT拥有从巨大语料库中学习、理解自然语言文本的强大功能。强大的对话、理解能力使得它仅仅用了…

ArcGIS Engine:报错无法嵌入互操作类型“ESRI.ArcGIS.Geometry.EnvelopeClass”。请改用适用的接口。

此错误是由于尝试直接实例化ArcGIS COM组件的某些互操作类引起的。这在.NET Framework 4及更高版本中是不被推荐的。 为了解决此问题&#xff0c;你需要确保在工程的引用中将ArcGIS的互操作类型设置为“不嵌入”。 按照以下步骤操作&#xff1a; 在解决方案资源管理器中找到…

网络爬虫指南

一、定义 网络爬虫&#xff0c;是按照一定规则&#xff0c;自动抓取网页信息。爬虫的本质是模拟浏览器打开网页&#xff0c;从网页中获取我们想要的那部分数据。 二、Python为什么适合爬虫 Python相比与其他编程语言&#xff0c;如java&#xff0c;c#&#xff0c;C&#xff…