在mach-o相關(guān)Api中會出現(xiàn)如下的常量
#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
势决,這就讓我百思不得其解访敌。
查詢到相關(guān)資料發(fā)現(xiàn)了注意涉及到內(nèi)存布局中的大小端概念。
注意到這里CIGAM
是MAGIC
的顛倒(reverse
)字符串,0xbebafeca
是0xcafebabe
的顛倒數(shù)字(這里是以2位為一個整體)。
大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲模式有點兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加腐泻,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習(xí)慣一致队询。
小端模式派桩,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中蚌斩,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來铆惑,高地址部分權(quán)值高,低地址部分權(quán)值低。
而且現(xiàn)在絕大部分操作系統(tǒng)都是小端模式鸭津,猜測可能是因為可以方便的進行加減運算彤侍,畢竟操作系統(tǒng)中加減元素是占大部分的。
也可以用如下的代碼來測試大小端模式:
short int x;
char x0,x1;
x = 0x1122;
x0 = ((char*)&x)[0]; //低地址單元
x1 = ((char*)&x)[1]; //高地址單元
NSLog(@"0x%x", x0);
若x0=0x11,則是大端; 若x0=0x22,則是小端逆趋。
經(jīng)測試發(fā)現(xiàn)盏阶,iOS系統(tǒng)是小端模式,因此微信App的fat_header
的magic
是CIGAM
闻书。
以上就是MachO的MAGIC數(shù)字介紹名斟。