大端、小端模式,网络字节序,多字节字符、Unicode字符存储

2024-02-14 06:48

本文主要是介绍大端、小端模式,网络字节序,多字节字符、Unicode字符存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于字节序(大端法、小端法)的定义

《UNXI网络编程》定义:
 术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。
 小端(低字节数据)存在起始地址(低地址单元),即是小端字节序;大端存在起始地址,即是大端字节序。
 

也可以说:
1.小端法(Little-Endian) :高字节数据 存放在 高地址单元,低字节数据 存放在 低地址单元。 高高低低
2.大端法(Big-Endian)   : 高字节数据 存放在 低地址单元,低字节数据 存放在 高地址单元。 高低低高

如果我们用 OP0 表示一个32位数据的最高字节,用OP3表示一个32位数据的最低字节
那么,对于int整型数据 0x12345678 。有:
OP0 : 0x12
OP1 : 0x34
OP2 : 0x56
OP3 : 0x78
其在内存中的存放顺序为:


大端、小端模式,网络字节序,多字节字符、Unicode字符存储 - 一门 - yyimen的博客

#include <stdio.h> #include <stdlib.h> int main() { int a = 0x12345678; char *pa = (char *)&a; for (int i = 0; i < 4; i++) printf("0x%x ", *pa++ & 0xff); system("pause"); return 0; }


我的小端机器上的结果,如图:

===============================================

网络字节序

我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?
也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢?

网络字节序定义:
收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。
而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。
可见多字节数值在发送前,在内存中数值应该以大端法存放。
网络字节序说是大端字节序。
比如我们经过网络发送 0x12345678 这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放,如图所示。

大端、小端模式,网络字节序,多字节字符、Unicode字符存储 - 一门 - yyimen的博客

===============================================

MBCS 多字节字符集
对于多字节字符,计算机的存储方式是:
前导字节 存放在 低字节单元
跟随字节 存放在 高字节单元
这样保证了,无论在大端还是小端模式的机器上,读取字符时,前导字节都先于跟随字节被读取,
而我们在编程时一般都对当前字符进行一番判断,如果编码小于128,则当前字符为单字节字符,否则为多字节字符的前导字符,与其后的一个跟随字节一起组合开一个字符
下面是我的验证代码、截图:

#include <stdio.h> #include <stdlib.h> int main() { char *str = "华夏"; char *pa = str; while (*pa) printf("0x%x ", *pa++ & 0xff); system("pause"); return 0; }

===============================================

Unicode 字符集
Unicode 字符的编码 方式, 小端机上高高低低,大端机上高低低高

下面是我的验证代码、截图:

#include <stdio.h> #include <stdlib.h> int main() { wchar_t str[] = L"0123456789ABCDEF"; char *pa = (char *)str; for (int i = 0; i < sizeof(str); i++) printf("0x%x ", *pa++ & 0xff); system("pause"); return 0; }



这篇关于大端、小端模式,网络字节序,多字节字符、Unicode字符存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/707797

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k