在mach-o相关Api中会出现如下的常量
#define FAT_MAGIC 0xcafebabe
#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */
#define FAT_MAGIC_64 0xcafebabf
#define FAT_CIGAM_64 0xbfbafeca /* NXSwapLong(FAT_MAGIC_64) */
struct fat_header {
uint32_t magic; /* FAT_MAGIC or FAT_MAGIC_64 */
uint32_t nfat_arch; /* number of structs that follow */
};
其中明确说明了
uint32_t magic;
是 /* FAT_MAGIC or FAT_MAGIC_64 */
但是在MachOView工具打开微信App的时候:
居然是
FAT_CIGAM
,这就让我百思不得其解。
查询到相关资料发现了注意涉及到内存布局中的大小端概念。
注意到这里CIGAM
是MAGIC
的颠倒(reverse
)字符串,0xbebafeca
是0xcafebabe
的颠倒数字(这里是以2位为一个整体)。
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
而且现在绝大部分操作系统都是小端模式,猜测可能是因为可以方便的进行加减运算,毕竟操作系统中加减元素是占大部分的。
也可以用如下的代码来测试大小端模式:
short int x;
char x0,x1;
x = 0x1122;
x0 = ((char*)&x)[0]; //低地址单元
x1 = ((char*)&x)[1]; //高地址单元
NSLog(@"0x%x", x0);
若x0=0x11,则是大端; 若x0=0x22,则是小端。
经测试发现,iOS系统是小端模式,因此微信App的fat_header
的magic
是CIGAM
。
以上就是MachO的MAGIC数字介绍。