首页 > 其他分享 >网络字节序与主机字节序的转换函数实践

网络字节序与主机字节序的转换函数实践

时间:2022-10-07 14:45:13浏览次数:73  
标签:字节 主机 函数 网络 地址 内存地址 低位

网络字节序与主机字节序的转换函数实践

1、什么是字节序?

字节序,顾名思义,就是字节组织的顺序
分为两种,一种是以IBM、Oracle公司为代表的大端序(big endian),一种是以Intel公司为首的小端序(little endian)
举个例子,0x1234567,这个是一个十六进制的整数,储存它需要至少四个字节。
如果从0x100开始储存0x1234567这个数,存储结构如下图

地址 0x100 (低地址) 0x101 0x102 0x103(高地址)
小端序 67 45 23 01
大端序 01 23 45 67

大端字节序(Big Endian)

高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。

小端字节序(Little Endian)

高位字节数据存放在内存高地址处,低位数据存放在内存低地址处。

2、为什么需要字节序呢?

很多人会问,为什么会有字节序,统一用大端序不行吗?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。

两种字节序优缺点

小端优点:

符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位。从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位。

大端优点:

直观的字节序地址,不要考虑对应关系只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出两者对照,一个字节一个字节的填充进去。

3、网络字节序与主机字节序的转换

tcp/ip规定它们的网络字节序都是大端字节序。主机字节序可能是大端也可能是小端,与主机的cpu有关,与操作系统无关
由于主机字节序的不同,数据从主机 A 到主机 B 的过程中,需要有一个标准化的过程,就是主机字节序和网络字节序互相转换
image

网络序转主机序

函数 含义 作用
ntohs() network to host short 把unsigned short类型从网络序转换到主机序
ntohl() network to host long 把unsigned long类型从网络序转换到主机序

主机序转网络序

函数 含义 作用
htons() host to network short 把unsigned short类型从主机序转换到网络序
htonl() host to network long 把unsigned long类型从主机序转换到网络序

参考文章

字节序的概念-CSDN
什么是字节序?-CSDN
主机字节序和网络字节序-CSDN
C++ 插入运算符cout-CSDN

标签:字节,主机,函数,网络,地址,内存地址,低位
From: https://www.cnblogs.com/foxcyg/p/16758748.html

相关文章

  • 网络字节序与主机字节序的转换函数实现
    1、网络字节序:是TCP/IP中一种固定好的数据表示格式,它与具体的CPU,操作系统,传输方式无关,从而可以保证数据在不同主机之间传输时能够兼容。2、主机字节序:即大端(BigEndian)......
  • 模板基类与正确的派生类函数调用--Effective C++ Item 43
    问题描述假设我们有这样一个业务场景,我们管理着许多公司,每个公司都有一个自己的许多日志信息需要处理,于是为了方便,我们写了一个模板类用来处理这些公司的信息,并且将这些公......
  • 网络字节序与主机字节序的转换函数实践
    网络字节序与主机字节序的相互转换常用系统调用Linuxsocket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换。#include<arpa/inet.h>uint32_thtonl(ui......
  • 激活函数还是有一点意思的!
    激活函数(Activationfunctions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如在神经元中,输入的......
  • KAL1 LINUX 官方文档之虚拟机版本 --- 在 Kali(主机)上安装 VirtualBox (更新于2022)
    在Kali(主机)上安装VirtualBox您可以在KaliLinux上安装VirtualBox ,允许您在KaliLinux中使用虚拟机(VM)。但是,如果您想将KaliLinux安装为VM,则需要我们的KaliL......
  • KAL1 LINUX 官方文档之虚拟机版本 --- 在 Apple Silicon (M1/M2) Mac(主机)上安装 VMwa
    您需要使用VMWare技术预览版的22H2版本。如果您至少没有使用PlayerVersionexp(20191287),那么您需要更新。由于VMWare更新程序软件的限制,如果您使用的是较早版......
  • 最近流行的激活函数
    最近又看了点深度学习的东西,主要看了一些关于激活函数的内容,不知道算不算新颖,但是我想把自己阅读后的分享一下,请各位给予评价与指点,谢谢!一般激活函数有如下一些性质:非线性: ......
  • 网络字节序与主机字节序的转换函数实践
    首先我们要对于网络字节序和主机字节序有一个初步的概念。字节序:字节在内存中储存的顺序字节序的种类:(1):大端字节序,数值高位储存在内存的低地址,低位储存在内存的高地址,在 ......
  • 【我开了C语言的金手指】二.函数(1)
    (一)函数的定义 是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定的任务,相较于其它的代码,具备相对独立性。 一般会有输入参数并有返回值,提供对过......
  • 【VB.NET】VB的字符操作函数
    函数以及其参数说明Asc/AscW(Char/String)AsInteger返回一个代表某个字符的字符编码的Integer值。Chr/ChrW(Integer)AsChar返回指定字符编码对应的字符。Filter(String(......