c语⾔字节地址最低位地址,字节序的理解----C语⾔和Python语
字节序是指多字节数据在计算机内存中存储或者⽹络传输时各字节的存储顺序。常见的主要有以下2种:
⼩端序(Little-Endian):低位字节排放在内存的低地址端即该值的起始地址,⾼位字节排放在内存的⾼地址端。最符合⼈的思维的字节序,地址低位存储值的低位,地址⾼位存储值的⾼位。该序因为从⼈的第⼀观感来说低位值⼩,就应该放在内存地址⼩的地⽅,也即内存地址低位,反之,⾼位值就应该放在内存地址⼤的地⽅,也即内存地址⾼位。在80X86平台上,系统将多字节中的低位存储在变量起始地址,使⽤⼩端法。
⼤端序(Big-Endian):⾼位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的⾼地址端。最直观的字节序,地址低位存储值的⾼位,地址⾼位存储值的低位。该序不需考虑对应关系,只需要把内存地址从左到右按照由低到⾼的顺序写出把值按照通常的⾼位到低位的顺序写出,两者对照,⼀个字节⼀个字节的填充进去。
常见的还⼀种是⽹络序,即⽹络字节顺序,它是TCP/IP中规定好的⼀种数据表⽰格式,它与具体的CPU类型、操作系统等⽆关,从⽽可以保证数据在不同主机之间传输时能够被正确解释,⽹络字节顺序采⽤big endian排序⽅式。
在C语⾔中,为了进⾏转换,socket库中提供了转换函数,包括下⾯四个:
htons:把unsigned short类型从主机序转换到⽹络序
htonl:把unsigned long类型从主机序转换到⽹络序
ntohs:把unsigned short类型从⽹络序转换到主机序
ntohl:把unsigned long类型从⽹络序转换到主机序
在使⽤little endian的系统中,这些函数会把字节序进⾏转换;在使⽤big endian类型的系统中,这些函数会定义成空宏⽽不作任何转换。
【例】如对于整数0x12345678,在Windows系统上(⼩端序存储)使⽤C语⾔和Python语⾔查看其不同表⽰⽅式。
其位[0-31]表⽰⽅式为:
⼩端序(Little-Endian)和⼤端序(Big-Endian)的表⽰⽅式为:
其⽹络字节序同⼤端法表⽰相同。
(1)C语⾔程序:
1 #include
2 #include
3 #pragma comment(lib, "ws2_32")
4 using namespacestd;5
6 voidmain()
7 {
8 int a = 0x12345678;
9 cout<
17 int b =htonl(a);18 cout<
25 getchar();26 }
其运⾏结果为:
在调试状态下,在内存窗⼝中查看变量a和变量b的地址,也可以清晰的看到两种字节序的不同存储情况。本例中变量a和变量b的地址分别为0x00B3FD3C和0x00B3FD24:
(2)Python语⾔程序:
1 #-*- coding: utf-8 -*-#
2
3 #-------------------------------------------------------------------------------
4 #Name: LittleAndBigEndianTest
5 #Description:
6 #Author: Administrator
7 #Date: 2018/7/8
8 #-------------------------------------------------------------------------------
9
10 importsys11 from struct import *
12 from ctypes import *
13 importnumpy as np14
15 a = 0x12345678编程先学c语言还是python
16 print(‘a:‘ +hex(a))17 for name, fmt in zip([‘LittleEndian:‘, ‘BigEndian:‘, ‘Network:‘], [Struct(‘<1i‘),
Struct(‘>1i‘), Struct(‘!1i‘)]):18 buffer =create_string_buffer(fmt.size)19 fmt.pack_into(buffer, 0, a)20 data =
np.frombuffer(buffer, dtype=np.uint8)21 print(name + str(map(lambda x: hex(x), data)))
其运⾏结果为:
结果同C语⾔版本⼀致,同时也验证了⽹络字节序同⼤端序结果完全相同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。