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


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

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

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


     

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. int main()  
    5. {  
    6.     int a = 0x12345678;  
    7.     char *pa = (char *)&a;  
    8.   
    9.     for (int i = 0; i < 4; i++)  
    10.         printf("0x%x ",  *pa++ & 0xff);  
    11.       
    12.     system("pause");  
    13.     return 0;  
    14. }  


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

     

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

    网络字节序

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

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

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

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

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. int main()  
    5. {  
    6.     char    *str = "华夏";  
    7.     char    *pa = str;  
    8.   
    9.     while (*pa)  
    10.         printf("0x%x ", *pa++ & 0xff);  
    11.       
    12.     system("pause");  
    13.     return 0;  
    14. }  


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

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

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

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. int main()  
    5. {  
    6.     wchar_t str[] = L"0123456789ABCDEF";  
    7.     char    *pa = (char *)str;  
    8.   
    9.     for (int i = 0; i < sizeof(str); i++)  
    10.         printf("0x%x ", *pa++ & 0xff);  
    11.       
    12.     system("pause");  
    13.     return 0;  
    14. }  



    转载自:http://blog.csdn.net/ltag0110rtag/article/details/7465061


  • 相关阅读:
    GO语言常用标准库03---time包
    GO语言常用标准库02---os包
    GO语言常用标准库01---strings包
    GO语言复合类型05---递归
    GO语言练习---对切片进行排序
    GO语言复合类型04---映射
    GO语言复合类型03---切片
    GO语言复合类型02---数组
    [踩坑记录] windows10 应用商店打不开 代码: 0x80131500
    [Linux kali] Kali KDE桌面安装中文输入法 不能登录系统
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787452.html
Copyright © 2020-2023  润新知