dpdk 大小端
阿新 • • 發佈:2020-09-16
個例子: 如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為 big-endian little-endian 0x0000 0x12 0xcd 0x0001 0x34 0xab 0x0002 0xab 0x34 0x0003 0xcd 0x12 除了moto的68K系列和dec的sparc是big endian外,常見的cpu都是little endian。ARM同時支援 big和little,實際應用中通常使用little endian,,Intel系列的CPU就是little endian的。
方法一:直接使用看變數的記憶體值,這裡需要使用一些除錯技巧。 #include<stdio.h> void main() { short s=0x1234; char * pTest=(char*)&s; printf("%p %0X %0X",&s,pTest[0],pTest[1]); } 以十六進位制輸出short型變數s在記憶體中的位元組分佈。 執行結果為: 0012FF7C 34 12
https://www.ruanyifeng.com/blog/2016/11/byte-order.html
網路位元組序一般是指大端傳輸。
/* * Work-around of a compilation error with ICC on invocations of the * rte_be_to_cpu_16() function. */ #ifdef __GCC__ #define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v)) #define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v)) #else #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN #defineRTE_BE_TO_CPU_16(be_16_v) (be_16_v) #define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v) #else #define RTE_BE_TO_CPU_16(be_16_v) \ (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8)) #define RTE_CPU_TO_BE_16(cpu_16_v) \ (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8)) #endif #endif /* __GCC__ */