字节序详细解读

article/2025/9/20 21:43:39

概念来了!!!

字节序(Byte Order)是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit。在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存中占用的字节数。在计算机系统中,当物理单位的长度大于1个字节时,就要区分字节顺序。

常见的字节顺序有两种:大端(Big-endian)和小端(Little-endian),当然还有其他字节顺序,但不常见,例如Middle Endian。

看概念肯定完犊子,接下来我们明确几个知识。。。

概念

1、高字节和低字节

什么是高字节?什么是低字节?

在一个n进制的位中,最左边的位叫最高有效位,最右边的叫最低有效位。

举个例子,1个int的整数123456789

二进制表示00000111010110111100110100010101
十六进制表示075BCD15

按照从右向左的方向,二进制中,0101是低字节,最左边的0000是高字节;十六进制中,15是低字节,07是高字节。

再通俗一点解释就是:8421码的,8这端为高位,1这端为低位,相应的字节则分别称为高位字节和低位字节。

补充:进制转换

在这里插入图片描述

2、高地址和低地址

在内存中,多字节对象都是被存储为连续的字节序列。假设将int整型在内存中的起始地址(首个字节存储位置)为0x1000,那么另外三个字节就存储在0x1001~0x1003。不管存储的字节顺序是怎样的,内存地址的分配都是从小到大的增长。其中0x1000称为低地址端,0x1003称为高地址端。

在这里插入图片描述

3、大端和小端

大端:高字节存放在低地址,低字节存放在高地址

小端:低字节存放在低地址,高字节存放在高地址

还是以上面的int 123456789为例,十六进制表示: 07 5B CD 15

内存地址(低——>高)字节存储顺序
大端(Big Endian)0x1000 0x1001 0x1002 0x10030x07 0x5B 0xCD 0x15高字节存放在低地址 低字节存放在高地址
小端(Litter Endian)0x1000 0x1001 0x1002 0x10030x15 0xCD 0x5B 0x07低字节存放在低地址 高字节存放在高地址

4、网络字节序和主机字节序

  • 大小端一般是由CPU架构决定的。

  • 网络字节序(Network Order):TCP/IP各层协议将字节序定义为Big Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

  • 主机字节序(Host Order):整数在内存中保存的顺序,它遵循Little Endian规则(不一定,要看主机的CPU架构)。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序列(Little Endian)和网络序(Big Endian)的转换。

字节序

1、字节序的特点

在这里插入图片描述

1、网络协议指定了通讯字节序—大端
2、只有在多字节数据作为整体处理时才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
4、异构计算机之间通讯,需要转换自己的字节序为网络字节序

2、为什么不统一使用一种字节序?

  • 计算机电路先处理低位字节,效率比较高。因为计算就是从低位开始的,所以计算机内部很多都是小端字节序。
  • 格式规范是为人类编写的,大端字节序更符合人类习惯。

3、字节序转换api

#include <netinet/in.h>
//htons函数 发 将主机字节序的端口 转换成 网络字节序的端口
uint16_t htons(uint16_t host16bitvalue);    //返回网络字节序的值
//htonl函数 发 将主机字节序的IP地址 转换成网络字节序的IP地址
uint32_t htonl(uint32_t host32bitvalue);    //返回网络字节序的值
//ntohs函数 收 将网络字节序的端口 转换成 主机字节序的端口
uint16_t ntohs(uint16_t net16bitvalue);     //返回主机字节序的值
//ntohl函数 收 将网络字节序的IP地址
uint32_t ntohl(uint32_t net32bitvalue);     //返回主机字节序的值

h代表host,n代表net,s代表short(两个字节),l代表long(4个字节),通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。有时可以用INADDR_ANY,INADDR_ANY指定地址让操作系统自己获取

  1. htons htonl ntohs ntohl 如果主机 和网络 字节序相同 前面4个函数不会颠倒数据
  2. htons htonl ntohs ntohl 如果主机 和网络 字节序 不相同 前面4个函数会颠倒数据

大小端 不是人为决定的

4、地址转换api

int inet_aton(const char* straddr,struct in_addr *addrp);
把字符串形式的“192.168.1.123”转为网络能识别的格式char* inet_ntoa(struct in_addr inaddr); 
把网络格式的ip地址转为字符串形式

大幅参考:https://www.cnblogs.com/Leo_wl/p/3427363.html
https://blog.csdn.net/weixin_43288201/article/details/106185290


http://chatgpt.dhexx.cn/article/CpcpZUqU.shtml

相关文章

JitPack的简单使用

JitPack的简单使用 由于工作需要,我要搭建多个项目,但是每个项目的基类,工具包,自定义的view,都是一样的,需要将这些代码复制到好几个项目里,所以萌生了一个想法,将这些基本不会改变的代码,做成一个依赖,一行代码引入项目 打开你的项目Git地址,创建发行版本 打开jitpack官网…

Gitee项目发布到JitPack

Gitee项目发布到JitPack 发布前的准备将Gitee项目发布到jitPack使用自己发布的库 发布前的准备 1.搜先注册一个Gitee账号 2.新建一个本地的android项目&#xff0c;并上传到Gitee。 (1) 根目录下build.gradle配置 dependencies {...classpath "com.android.tools.build:g…

【jitpack】android implementation 远程仓库

目录 前言接入步骤使用说明问题后记结束语 前言 做android的小伙伴都知道&#xff0c;android studio 在使用其他三方项目的时候使用gradle来管理版本,如直接使用如下就能快速把 appcopmt-v7 引入到项目中使用 implementation com.android.support:appcompat-v7:28.0.0 其实…

【JitPack】发布一个你自己的 Android 依赖库

文章目录 背景步骤新建 Android Library 项目配置 Gradle提交项目到 githubPull Request 到主分支创建 tag 并发布 release 版本JitPack 生成项目的依赖库第三方应用集成使用依赖库 JitPack 生成依赖库的 pom.xml 文件地址参考链接 背景 最近突然想开发个 Android Library&…

Android私有库gitee发布到JitPack后,编译通过但依赖不到。

JitPack编译通过后点击查看log只有这个&#xff1a; Subscription is not active right now Requested subscription: gitee.com/huile_1_0. Your subscriptions are listed in https://jitpack.io/w/user Please contact Support or repository admins if you need assistanc…

JitPack让第三方依赖更简单(第一种方法)

前面我们讲了如何将我们开发常用的工具发布到jcenter&#xff0c;然后进行依赖&#xff0c;这样有利于提高开发的效率&#xff0c;但是&#xff0c;又出现了一种新的发布方式&#xff0c;虽然现在使用的人还没有jcenter多&#xff0c;但是个人感觉未来使用的人会超过jcenter&am…

Android自定义library上传到JitPack

一、背景 最近公司不是太忙&#xff0c;闲的无聊&#xff0c;准备整理下属于自己的library库&#xff0c;想把自己平时用到的库保存起来到JitPack上&#xff0c;用的时候直接依赖添加。下面是我们把library发布到JitPack上去的记录过程。 二、项目配置 1.版本不同配置方法有些不…

maven { url “https://jitpack.io“ }

maven { url "https://jitpack.io" } 不能写在项目的build.gradle里面&#xff0c;要写在项目的setting.gradle

AndroidStudio之https://jitpack.io

前言 很多小伙伴自己写了一个库,打算开源出来,但是直接给别人发jar包或者aar包,别人使用都很不方便,而且版本更新也不方便,所以很多小伙伴把开源库放到了远程仓库里(如maven或jcenter),但是麻烦就麻烦在需要打包导出等。 而今天我要推荐一个超级方便的远程仓库:https://jitpa…

Android 发布代码到github 并且部署到 JitPack maven 仓库详细步骤

废话不多说&#xff0c;直接上步骤干货 Step1 在项目根目录的build.gradle 文件中加入 buildscript {repositories {maven { url https://jitpack.io }}dependencies {classpath com.github.dcendents:android-maven-gradle-plugin:2.1} }allprojects {repositories {maven {…

JitPack让第三方依赖更简单(第二种方法)

文章目录 前言步骤使用结语 每日一句正能量 如果青春是醺人欲醉的海风&#xff0c;那么自信就是这和风前行的路标&#xff0c;如果青春是巍峨入云的高耸&#xff0c;那么拼搏就是这山脉层层拔高的动力&#xff1b;如果青春是高歌奋进的谱曲&#xff0c;那么坚强就是这旋律奏响的…

发布开源库的踩坑经历:jitpack.io

前言 很多小伙伴自己写了一个库,打算开源出来,但是直接给别人发jar包或者aar包,别人使用都很不方便,而且版本更新也不方便,所以很多小伙伴把开源库放到了远程仓库里(如maven或jcenter),但是麻烦就麻烦在需要打包导出等。 而今天我要推荐一个超级方便的远程仓库:JitPack | Pub…

maven { url ‘https://www.jitpack.io‘ }在新版Android Studio中的位置

Android Studio升级到Arctic Fox后&#xff0c;一些配置项的位置都做了改变。 github上的很多库通过JitPack.io发布的&#xff0c;引用这些库时&#xff0c;除了在模块的build.gradle文件中加入依赖&#xff0c;还要在项目的build.gradle文件中加入maven { url ‘https://www.j…

真香警告~JitPack 开源库集成平台

文章目录 前言简介使用场景:一、准备工作1.1 生成私人令牌1.2 在JitPack中配置 Gitee 访问权限 二、准备Gitee 码云项目2.1 将本地的开发项目上传到 Gitee仓库2.2 为源码仓库创建 发行&#xff08;Release&#xff09;版本 三、开源库集成JitPack3.1 进入 JitPack&#xff0c;使…

基于新版本Gradle上传jitpack开源项目

因为新版本的gradle编译开源库的方法已经变了&#xff0c;所以这边记录下 1.第一步创建一个空项目 2.因为这样会创建出来一个app项目&#xff0c;我们上传git是不需要这个的&#xff0c;所以我们在 项目中setting.gradle目录下注释掉 app模块&#xff0c;然后就可以手动删除…

Android 上传代码到gitee并发布到Jitpack生成远程库

# 一创建项目 查看toollibrary主要配置 这里附上关键代码 plugins {id com.android.libraryid org.jetbrains.kotlin.androidid maven-publish } task generateSourcesJar(type: Jar) {from android.sourceSets.main.java.srcDirsclassifier sources } afterEvaluate {publish…

jitpack 介绍

2019独角兽企业重金招聘Python工程师标准>>> jitpack 一个有意思的工具&#xff0c; 可以从github、码云根据commitId、tag 生成maven依赖&#xff0c;减少代码下载、打包等步骤。工具地址 https://jitpack.io/ 转载于:https://my.oschina.net/u/2000646/blog/2966…

你会在 JitPack 上创建依赖库吗?

为什么写 看见标题有人可能会轻蔑一笑&#xff0c;多简单个事&#xff1f;还至于专门写一篇文章吗&#xff1f; 我之前也以为挺简单的&#xff0c;因为之前自己也上传过&#xff0c;但是前几天的经历告诉我没有那么简单&#xff0c;特别是现在安卓 Gradle 升级到 7.0 之后。。…

Jitpack使用指南:maven-publish如虎,jitpack如翼 【安卓Java组件化模块化】【更多gradle技巧】

上文总结了三种多模块开发的方法。 第一种&#xff1a;在setting.gradle中定义子模块然后 api Project(:...)&#xff0c;直接引用 。第二种&#xff0c;使用 maven-publish 部署至本地仓库第三种&#xff0c;使用 jitpack.io 等部署至远程服务器 我的第一个开源项目就依次用…

使用jitpack发布你自己的依赖库

如何优雅的让其他开发者使用我们的库。 我们经常通过gradle导入第三方库&#xff0c;那么我们自己的库如何提供给其他开发者使用&#xff1f;下边我们分别介绍使用jitpack、mavenCentral&#xff08;以前叫JCenter&#xff09;来发布我们的库。 在使用前&#xff0c;我们先了解…