大端、小端模式,网络字节序,多字节字符、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

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现