字节序: big-endian vs little-endian

本文介绍了字节序的概念,包括大端序(big-endian)和小端序(little-endian)的存储方式,并提供了通过readelf命令、lscpu命令以及代码(union)来判断系统字节序的方法。此外,还提到了网络序,即网络字节序通常使用大端序。
摘要由CSDN通过智能技术生成

如何快速记忆

big-endian又名大尾序,就是数值的尾巴存储在大地址上。尾是相对我们认识的变量值,大是指地址;
相对应,little-endian又名小尾序,数值的尾巴存储在小地址上。
一句话大小是尾巴的地址,尾巴是数值的尾巴,指的是0xABCD(十进制43981)的D
在这里插入图片描述 在这里插入图片描述

如何判断字节序是大端还是小端

  1. 通过二进制工具查看: readelf -h main
int main(){
	return 0;
}

编译出二进制

g++ main.cpp -o main

使用readelf查看字节序

readelf -h main

结果如下(ELF Magic第6个字节代表字节序,0 无效格式; 1 小端格式; 2 大端格式)
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2’s complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1060
Start of program headers: 64 (bytes into file)
Start of section headers: 14976 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 14
Size of section headers: 64 (bytes)
Number of section headers: 32
Section header string table index: 31

  1. 使用命令行查看: lscpu | grep -i byte

yms@yms-System-Product-Name:~/ws/thread_local$ lscpu | grep -i byte
Byte Order: Little Endian

  1. 使用代码(union)进行判断
 #include <stdio.h>
 
 union Endian {
     char a;
     int b;
 };
 
 int main(){
     Endian endian;
     endian.b = 1;
 
     if (endian.a == 1) {
         printf("little endian\n");
     }else{
         printf("big endian\n");
     }   
     return 0;
 }

yms@yms-System-Product-Name:~/ws$ ./main
little endian

网络序

网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值