字节序

article/2025/9/20 21:46:01

1.字节序

字节序,又称端序或尾序,指的是多字节数据在内存中的存放顺序。例如一个int型变量x占用4个字节,假设它的起始地址&x为0x10,那么x将会被存储在
0x10、0x11、0x12和0x13位置上。

在用C++写的客户端和Java写的服务端的通信时,发现数据通过TCP连接传输后收到的与发送的不一致,所以要引入大端和小端的概念。

2.大端和小端

计算机有两种储存数据的方式:大端字节序(Big Endian)和小端字节序(Little Endian)。

以一个两字节short型变量0x0102的存储举例:

  • 大端字节序:高位字节在前,低位字节在后,01|02,符合人们的读写习惯。
  • 小端字节序:低位字节在前,高位字节在后,02|01。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SvqDBf3-1585496856262)(imgs/BigAndLittleEndian.gif)]
一个四字节数据0x01234567分别用大小端字节序存储的结果如上图所示。

3.WHY?

计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节…
如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节;小端字节序正好相反。

如果这样,那统一用符合我们人类读写习惯的大端序就好了呀,为何还要弄出个小端序了?

这是疑问计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的,所以计算机的内部处理都是小端字节序。
但是人类还是习惯读写大端字节序,所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

4.网络序和主机序

网络字节序:TCP/IP各层协议将字节序定义为Big Endian,因此TCP/IP协议中使用的字节序是大端序。

主机字节序:整数在内存中存储的顺序,目前以Little Endian比较普遍(不同的CPU有不同的字节序)。

回到开头说的问题,当一个C++的程序要与一个Java程序交互时,发现收发的数据不一致,这是因为:

  • C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而现在比较普遍的x86处理器是Little Endian。
  • Java编写的程序则唯一采用Big Endian方式来存储数据。

所以,如果你的C++程序通过socket将变量a = 0x12345678的首地址传递给了Java程序,由于Java采取Big Endian方式存取数据,
很自然的它会将你的数据解析为0x78563412,这样问题就出现了。

5.转换

为避免开头说到的网络通信中存在的问题,我们可以在传输数据之前和接收数据之后对数据进行相应处理,也就是主机序和网络序的转换。

C++提供了相应的函数接口,htonl、htons用于主机序转换到网络序,ntohl、ntohs用于网络序转换到主机序。
htons用于主机序转换到网络序,ntohl、ntohs用于网络序转换到主机序。
其中h表示host主机,n表示network网络。


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

相关文章

字节序详细解读

概念来了!!! 字节序(Byte Order)是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit。在C中,除了8bi…

JitPack的简单使用

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

Gitee项目发布到JitPack

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

【jitpack】android implementation 远程仓库

目录 前言接入步骤使用说明问题后记结束语 前言 做android的小伙伴都知道,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只有这个: 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,然后进行依赖,这样有利于提高开发的效率,但是,又出现了一种新的发布方式,虽然现在使用的人还没有jcenter多,但是个人感觉未来使用的人会超过jcenter&am…

Android自定义library上传到JitPack

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

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

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

AndroidStudio之https://jitpack.io

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

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

废话不多说,直接上步骤干货 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让第三方依赖更简单(第二种方法)

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

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

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

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

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

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

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

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

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

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 一个有意思的工具, 可以从github、码云根据commitId、tag 生成maven依赖,减少代码下载、打包等步骤。工具地址 https://jitpack.io/ 转载于:https://my.oschina.net/u/2000646/blog/2966…

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

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

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

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