我正在撰寫一個決議器(撰寫 NodeJS 代碼),其中 C 規范為位元組順序定義了 LittleEndian 系統,其中最高有效位位于右端。
在描述中的某個地方,他們這樣說:
最高有效位(MSB)在左側,資訊編碼為 32 位無符號整數,如下 12 位(年)| 4 位(月)...
所以我認為以這種方式決議位是合乎邏輯的(偽代碼)
const number = readUint32BE(data) //unsigned integer 32 bits
const year = (number >> 20)
這在邏輯上有意義嗎?
但是我得到了錯誤的數字,我得到了正確的數字(合理的年份)如果我這樣做:
const number = readUint32LE(data) //unsigned integer 32 bits
const year = (number >> 20)
請幫助理解我在想什么?
uj5u.com熱心網友回復:
如果您從外部讀取資料,位元組順序確實很重要。
例子:
/* read two-byte integer, little-endian: */
unsigned short i1 = getc(ifp); x |= getc(ifp) << 8;
/* read two-byte integer, big-endian: */
unsigned short i2 = getc(ifp); y = (y << 8) | getc(ifp);
如果您使用位元組指標來訪問記憶體中整數的位元組,那么位元組順序確實很重要。例子:
uint32_t x = 0x04030201;
unsigned char *p = &x;
printf("x\n", *p);
在小端機器上,這將列印01
. 在大端機器上,這會列印04
. 在小端機器上,指標&x
字面上指向 4 位元組整數的“小端” 0x04030201
。
但是當你在做算術時,當你在做按位運算時,對于多位元組數量的值,位元組順序并不重要。這些操作都發生在整個值上,而不是值的單個位元組上。例子:
uint32_t x = 0x04030201;
unsigned char msbyte = x >> 24; /* always most-significant byte */
unsigned char lsbyte = x & 0xff; /* always least-significant byte */
unsigned char lsbit = x & 0x01; /* always least-significant bit */
在原始問題中,鑒于“C 規范定義 LittleEndian”,偽代碼
const number = readUint32LE(data)
將是正確的,而替代方案
const number = readUint32BE(data) // WRONG
將是不正確的。但是,一旦number
正確讀入,它現在是一個正確的值,并且不再適用位元組順序注意事項。“最高有效位在左側”這一規定是不必要的,而且有些誤導。像這樣的代碼
const year = (number >> 20)
提取 12 個最高有效位是完全正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507336.html