大端和小端传输字节完整版
大端和小端传输字节序
- 大端和小端
- 一、最高有效位、最低有效位
- 1.MSB(Most significant Bit)最高有效位
- 2.LSB(Least Significant Bit)最低有效位
- 二、内存地址
- 三、大端和小端
- 四、网络字节序和主机字节序
- 五、C#位操作符
- 六、C#中关于大端和小端的转换
- 七、关于负数
- 八、关于汉字编码以及与字节序的关系
- 网络通讯
- 文件
C#转换代码文件
大端和小端
在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit。在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存中占用的字节数。在计算机系统中,当物理单位的长度大于1个字节时,就要区分字节顺序。常见的字节顺序有两种:Big Endian(High-byte first) 和 Litter Endian(Low-byte first),当然还有其他字节顺序,但不常见,例如Middle Endian。
一、最高有效位、最低有效位
要理解Big Endian和Little Endian,首先要搞清楚MSB和LSB。
1.MSB(Most significant Bit)最高有效位
在一个n位二进制数字中n-1位,也就是最左边的位。
2.LSB(Least Significant Bit)最低有效位
指最右边的位。
例如:一个int类型的整形123456789
二进制表达方式: 0000 0111 0101 1011 1100 1101 0001 0101(从右向左,每4bit对齐,最左边(高位)不够用0补齐)
十六进制表达方式:0 7 5 B C D 1 5
按照上述关于MSB和LSB的意思,在二进制表达方式中,bit从0开始,从右向左,bit 0位最低有效位,而bit 23为最高有效位。而我们一般称左边的0x07为高位字节,0x15为低位字节。
再通俗一点解释就是:8421的,8这端为高位,1这端为低位,相应的字节则分别称为高位字节和低位字节。
二、内存地址
在内存中,多字节对象都是被存储为连续的字节序列。例如在C语言中,一个类型为int的变量n,如果其存储的首个字节的地址为0x1000,那么剩余3个字节地址将存储在0x1001~0x1003。总之,不管具体字节顺序是以什么方式排列,内存地址的分配一般是从小到大的增长。 我们常把0x1000称为低地址端,把0x1003称为高地址端。
三、大端和小端
搞清楚MSB、LSB、高位字节、低位字节之后,再理解大端和小端,就相当容易了,先看看概念:
小端Little Endian:低字节存放在低地址,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
大端Big Endian:高字节存放在低地址,即高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
以二节中的例子int类型整数123456789位例:
小端在内存中排列: 0x15 0xCD 0x5B 0x07(低位在前)
大端在内存中排列: 0x07 0x5B 0xCD 0x15(高位在前)
从例子中可以看出小端比较符合人的思维,而大端则看上去非常直观。
注:
- 例子中是假设编译器支持int为32位的前提下,如果是16位,那大端的排列则为0xCD 0x15 0x07 0x5B
- 大小端一般是由CPU架构决定,常见的Intel、AMD的CPU使用的是小端字节,而PowerPC使用的是大端字节序,有些ARM处理器还可以选择大端还是小端模式,具体自行查阅。
- C#中,字节序跟编译平台所在的CPU相关,例如在Intel x86 CPU架构的windows平台中,C#采用的小端序。而Java由于JVM屏蔽不了不同CPU架构导致额字节序差异,所以默认采用大端字节。所以,大小端模式是由CPU决定,而编译器又可能会改变这种模式。

四、网络字节序和主机字节序
网络字节序(Network Order):TCP/IP各层协议将字节序定义为Big Endian,因此TCP/IP协议中的字节序同称之为网络字节序。
主机字节序(Host Order):整数在内存中保存的顺序,它遵循Little Endian规则(不一定,要看主机的CPU架构)。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序列(Little Endian)和网络序(Big Endian)的转换。
如果是做跨平台开发时,双方需要协商好字节序,然后根据程序运行的环境,确定是否需要字节序转换。
例如约定的通讯字节序位是Big Endian,默认的window采用的Little Endian,那收到数据后就需要做转换操作。
五、C#位操作符
这里简单记录一下C#位操作符,方便以后自己查阅,也方便理解后面的讲解。
- 按位与&
1&0为0;0&0为0;1&1为1 - 按位与|
1|0为1;0|0为0;1|1为1 - 按位取反~
~1为0; ~0为1; - 按位异或^
1^1为0; 0^0为0; 1^0为1; - 左移<<
位左移运算,将整个数向左移若干位,左移后空出的部分0补齐 - 右移>>
位右移运算,将整个数向右移若干位,右移后空出的部分用0补齐
六、C#中关于大端和小端的转换
- 重复轮子
using System;namespace Framework.NetPackage.Common
{/// <summary>/// 字节序转换辅助类/// </summary>public static class Endian{public static short SwapInt16(this short n){return (short)(((n & 0xff) << 8) | ((n >> 8) & 0xff));}public static ushort SwapUInt16(this ushort n){return (ushort)(((n & 0xff) << 8) | ((n >> 8) & 0xff));}public static int SwapInt32(this int n){return (int)(((SwapInt16((short)n) & 0xffff) << 0x10) |(SwapInt16((short)(n >> 0x10)) & 0xffff));}public static uint SwapUInt32(this uint n){return (uint)(((SwapUInt16((ushort)n) & 0xffff) << 0x10) |(SwapUInt16((ushort)(n >> 0x10)) & 0xffff));}public static long SwapInt64(this long n){return (long)(((SwapInt32((int)n) & 0xffffffffL) << 0x20) |(SwapInt32((int)(n >> 0x20)) & 0xffffffffL));}public static ulong SwapUInt64(this ulong n){return (ulong)(((SwapUInt32((uint)n) & 0xffffffffL) << 0x20) |(SwapUInt32((uint)(n >> 0x20)) & 0xffffffffL));}}
}
- BCL库支持的函数
System.Net.IPaddress.HostToNetworkOrder、System.Net.IPAddress.NetworkToHostOrder,这两个函数的内容实现和上面重复轮子原理一样。
/// <summary>
/// short类型 小端转大端
/// </summary>
/// <param name="n">int类型大小</param>
/// <returns></returns>
public static byte[] ShortHostToNetworkOrderBytes(this short n)
{return BitConverter.GetBytes(IPAddress.HostToNetworkOrder(n));
}/// <summary>
/// short类型 大端转小端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static byte[] ShortNetworkToHostOrderBytes(this short n)
{return BitConverter.GetBytes(IPAddress.NetworkToHostOrder(n));
}/// <summary>
/// short类型 小端转大端
/// </summary>
/// <param name="n">int类型大小</param>
/// <returns></returns>
public static short ShortHostToNetworkOrder(this short n)
{return IPAddress.HostToNetworkOrder(n);
}/// <summary>
/// short类型 大端转小端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static short ShortNetworkToHostOrder(this short n)
{return IPAddress.NetworkToHostOrder(n);
}/// <summary>
/// int类型 小端转大端
/// </summary>
/// <param name="n">int类型大小</param>
/// <returns></returns>
public static byte[] IntHostToNetworkOrderBytes(this int n)
{return BitConverter.GetBytes(IPAddress.HostToNetworkOrder(n));
}/// <summary>
/// int类型 大端转小端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static byte[] IntNetworkToHostOrderBytes(this int n)
{return BitConverter.GetBytes(IPAddress.NetworkToHostOrder(n));
}/// <summary>
/// int类型 小端转大端
/// </summary>
/// <param name="n">int类型大小</param>
/// <returns></returns>
public static int IntHostToNetworkOrder(this int n)
{return IPAddress.HostToNetworkOrder(n);
}/// <summary>
/// int类型 大端转小端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static int IntNetworkToHostOrder(this int n)
{return IPAddress.NetworkToHostOrder(n);
}/// <summary>
/// long类型 小端转大端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static byte[] LongHostToNetworkOrderBytes(this long n)
{return BitConverter.GetBytes(IPAddress.HostToNetworkOrder(n));
}/// <summary>
/// long类型 大端转小端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static byte[] LongNetworkToHostOrderBytes(this long n)
{return BitConverter.GetBytes(IPAddress.NetworkToHostOrder(n));
}/// <summary>
/// long类型 小端转大端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static long LongHostToNetworkOrder(this long n)
{return IPAddress.HostToNetworkOrder(n);
}/// <summary>
/// long类型 大端转小端
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static long LongNetworkToHostOrder(this long n)
{return IPAddress.NetworkToHostOrder(n);
}
七、关于负数
在计算机中,负数以及其绝对值的补码形式表示,不明白可以查阅九中贴出的相关资源。关于负数的字节序跟一般整数的字节序处理没有任何区别。
八、关于汉字编码以及与字节序的关系
- 对于gb2312、gbk、gb1&8030、bigs,其编码某个汉字产生的字节顺序,由某编码方案本身决定,不受CPU字节序的影响。其实这几种编码的字节序和大端模式的顺序是一致的。

- UTF-8
UTF-8和gb系列编码一样,其编码某个汉字产生的字节顺序,由其编码方案决定,不受CPU字节序的影响。无论一个汉字有多少个字节,它的字节序与编码顺序保持一致。

- Unicode
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。所以他没有要求如何存储编码后的字节,也就受CPU字节序的影响。
Unicode的具体实现包括UTF-16、UTF-32(当然也包括UTF-8,但由于其编码方式和编码后的字节序与其他Unicode编码实现有较大区别,所以单独拿出来讲解的)。
- 总结
网络通讯
在实际的网络通讯中,网络协议例如TCP是规定网络字节序(Network Order)是大端。而针对汉字具体使用什么编码,通讯双方要么提前约定好,要么就需要在数据包中标识好汉字具体使用的编码。
如果在网络通讯中,涉及例如UTF16这样区分大小端的编码,除非按网络协议要求采用大端模式是,否则也要事先约定好,或者在数据包中标识好使用的字节序模式。
文件
文件的也会存储汉字,当然也要进行编码。如果采用UTF-16这样的有字节序模式区分的编码,编码规则要求可以在文件头部的BOM(Byte Order Mark)来标记。如果没有标记,除非事先知道字节序的模式,否则只能大小端都试一遍。
相关文章:
大端和小端传输字节完整版
大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…...
华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接
文章目录 前言思路主要思路关于f函数的剖析Code就到这,铁子们下期见!!!! 前言 铁子们好啊!今天阿辉又给大家来更新新一道好题,下面链接是23年9月27的华为笔试原题,LeetCode上面的ha…...
ES实战--性能提升
触发冲刷的条件: 1.内存缓冲区已满 2.自上次冲刷后超过了一定时间 3.事务日志达到了一定阀值 对名为get-together的Elasticsearch索引执行优化操作,将索引中的数据段(segments)合并到指定的数量1 GET /get-together/_optimize?max_num_segm…...
解决ModuleNotFoundError: No module named ‘pysqlite2‘
目录 一、问题描述: 二、问题分析: 三、问题解决: 四、参考文章: 一、问题描述: 在重新安装的anaconda环境中自建了一个新虚拟环境,再安装完jupyter后(pip install jupyter)&am…...
腾讯云4核8G服务器够用吗?能支持多少人?
腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…...
React 的调度系统 Scheduler
原文地址1 原文地址2 其中startTime是任务开始的时间,默认是-1,任务开始时将任务开始时间赋值给了startTime, 这里意思是判断这个任务执行时间是否超过5ms(写死的)。若超过,则要交出。...
微服务OAuth 2.1认证授权Demo方案(Spring Security 6)
文章目录 一、介绍二、auth微服务代码1. SecurityConfig2. UserDetailsService3. 总结 三、gateway微服务代码1. 统一处理CORS问题 四、content微服务代码1. controller2. SecurityConfig3. 解析JWT Utils4. 总结 五、一些坑 书接上文 微服务OAuth 2.1认证授权可行性方案(Sprin…...
WSL使用Centos7发行版(rootfs)
参考 导入要与 WSL 一起使用的任何 Linux 发行版 microsoftWSL2 的 2.0 更新彻底解决网络问题install daemon and client binaries on linuxInstall Compose standalone WSL配置 在HOST中,编辑用户目录下的.wslconfig文件 我需要使用docker,测试发现a…...
ClickHouse--04--数据库引擎、Log 系列表引擎、 Special 系列表引擎
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.数据库引擎1.1 Ordinary 默认数据库引擎1.2 MySQL 数据库引擎MySQL 引擎语法字段类型的映射 2.ClickHouse 表引擎3.Log 系列表引擎几种 Log 表引擎的共性是&#…...
docker的底层原理
概述:Docker的底层原理基于容器化技术,通过使用命名空间和控制组等技术实现资源的隔离与管理。 底层原理: 客户端-服务器架构:Docker采用的是Client-Server架构,其中Docker守护进程(daemon)运…...
有关光猫、路由器、交换机、网关的理解
前提 在了解计算机网络的过程中,出现了这四个名词:光猫、路由器、交换机、网络。有点模糊,查阅互联网相关资料,进行整理。如有错误,欢迎大家批评指正。 光猫 首先光猫是物理存在的,大家在家里应该都可以…...
图像旋转翻转变换
题目描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。 其中,可能的操作及对应字符有如下四种: A:顺时针旋转90度; B:逆时针旋转90度; C:…...
网站常见的反爬手段及反反爬思路
摘要:介绍常见的反爬手段和反反爬思路,内容详细具体,明晰解释每一步,非常适合小白和初学者学习!!! 目录 一、明确几个概念 二、常见的反爬手段及反反爬思路 1、检测user-agent 2、ip 访问频率的限制 …...
GUI—— 从的可执行exe文件中提取jar包并反编译成Java
从exe4j生成的可执行文件中提取嵌入的jar包并反编译成Java代码,可以按照以下步骤操作: 步骤1:提取jar包 1.运行exe程序:首先启动exe4j生成的.exe可执行文件。当它运行时,通常会将内部包含的jar文件解压到临时目录下。…...
阿里云服务器镜像是什么?如何选择镜像?
阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…...
C语言------一种思路解决实际问题
1.比赛名次问题 ABCDE参加比赛,那么每个人的名次都有5种可能,即1,2,3,4,5; int main() {int a 0;int b 0;int c 0;int d 0;int e 0;for (a 1; a < 5; a){for (b 1; b < 5; b){for…...
前端判断对象为空
一.使用JSON.stringify()方法: JSON.stringify() 是将一个JavaScript对象或值转换为JSON格式字符串,如果最终只得到一个{},就说明他是一个空对象 let obj1 {}; console.log(JSON.stringify(obj1) "{}"); //true 表示为空对象l…...
DS:栈和队列的相互实现
创作不易,感谢友友们三连!! 一、前言 栈和队列的相互实现是用两个栈去实现队列或者是用两个队列去实现栈,这样其实是把问题复杂化的,实际中没有什么应用价值,但是通过他们的相互实现可以让我们更加深入地理…...
Hack The Box-Office
端口扫描&信息收集 使用nmap对靶机进行扫描 nmap -sC -sV 10.10.11.3开放了80端口,并且注意到该ip对应的域名为office.htb,将其加入到hosts文件中访问之 注意到扫描出来的还有robots文件,经过尝试后只有administrator界面是可以访问的 …...
android aidl进程间通信封装通用实现
接上一篇的分析,今天继续 aidl复杂流程封装-CSDN博客 今天的任务就是将代码梳理下放进来 1 项目gradle配置: 需要将对应的代码放到各自的目录下,这里仅贴下关键内容,细节可以下载代码慢慢看 sourceSets { main { manifest.srcFile src/main/And…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
华为OD机考- 简单的自动曝光/平均像素
import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...
OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...
可下载旧版app屏蔽更新的app市场
软件介绍 手机用久了,app越来越臃肿,老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法,还能帮我们卸载不需要的app。 手机现状 如今的app不断更新,看似在优化,实则内存占用越来越大,对手机性…...
【Docker 02】Docker 安装
🌈 一、各版本的平台支持情况 ⭐ 1. Server 版本 Server 版本的 Docker 就只有个命令行,没有界面。 Platformx86_64 / amd64arm64 / aarch64arm(32 - bit)s390xCentOs√√Debian√√√Fedora√√Raspbian√RHEL√SLES√Ubuntu√√√√Binaries√√√ …...
n8n:解锁自动化工作流的无限可能
在当今快节奏的数字时代,无论是企业还是个人,都渴望提高工作效率,减少重复性任务的繁琐操作。而 n8n,这个强大的开源自动化工具,就像一位智能的数字助手,悄然走进了许多人的工作和生活,成为提升…...
