linux核心裡面有下面**:
struct iphdr ;
linux裡面區分了bit位序,對於大多數cpu構架來說,bit位序與位元組序是對應的,對於少數偏僻、不常用的cpu,可能會出現bit位序與位元組序不一致的情況。由於目前linux支援的系統還未出現本情況,所以目前linux的__little_endian_bitfield和__big_endian_bitfield與__big_endian和__little_endian是一一對應的,一致的。
另外,下面寫一段c測試**,並分析彙編**,驗證bit位序在小頭序上的存貯:
#include
struct hdr ;
/* intel,little endian下,h放高位,l放地位,下面是驗證** */
/* 大字節序由於本人機器上沒有mips的gcc編譯環境,暫無法提供 */
main()
關鍵彙編如下:
80483d9: 0f b6 44 24 1f movzbl 0x1f(%esp),%eax #從堆疊中取出c的值放到eax
80483de: c7 04 24 d4 84 04 08 movl $0x80484d4,(%esp)
80483e5: 89 c2 mov %eax,%edx
80483e7: c0 ea 04 shr $0x4,%dl #取c右移4位後放入dl
80483ea: 0f b6 d2 movzbl %dl,%edx #dl擴充套件到乙個long的edx,printf接受的變參是以word為單位
80483ed: 89 54 24 0c mov %edx,0xc(%esp) #第乙個引數壓棧,也就是pst->h
80483f1: 89 c2 mov %eax,%edx
80483f3: 83 e0 01 and $0x1,%eax #c取最後乙個bit放入eax
80483f6: d0 ea shr %dl #c右移1位
80483f8: 83 e2 07 and $0x7,%edx #取edx低3位
80483fb: 89 54 24 08 mov %edx,0x8(%esp) #第二個引數壓棧,也就是pst->m
80483ff: 89 44 24 04 mov %eax,0x4(%esp) #第三個引數壓棧,也就是pst->l
8048403: e8 ec fe ff ff call 80482f4
bit 位域大小端轉換問題
由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組 大端 序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。16bit和32bit的大小端轉換很常見,...
mongo裡的狀態位運算 bit
今天用到了位運算,若干個子狀態符合一定要求時,判定其父狀態。handler.db.task.find and modify query update set new true 首先,在mongo中,find and modify是原子操作 findandmodify 強調操作的原子性 atomica...
Bit(位)與Byte(位元組)的區別
bit 位 與byte 位元組 的區別 bit意為 位 或 位元 是計算機運算的基礎 byte意為 位元組 是計算機檔案大小的基本計算單位 說到usb2.0標準介面傳輸速率。許多人都將 480mbps 誤解為480兆 秒。其實,這是錯誤的,事實上 480mbps 應為 480兆位元 秒 或 480兆...