簡體   English   中英

在C中將Little Endian十六進制轉換為Big Endian十進制

[英]converting little endian hex to big endian decimal in C

我正在嘗試了解和實現基於FAT12的簡單文件系統。 我目前正在查看以下代碼片段,這使我發瘋:

int getTotalSize(char * mmap) { int *tmp1 = malloc(sizeof(int)); int *tmp2 = malloc(sizeof(int)); int retVal;

* tmp1 = mmap[19];
* tmp2 = mmap[20];
printf("%d and %d read\n",*tmp1,*tmp2);
retVal = *tmp1+((*tmp2)<<8);
free(tmp1);
free(tmp2);
return retVal;

};

從到目前為止的內容來看,FAT12格式以小尾數格式存儲整數。 並且上面的代碼正在獲取文件系統的大小,該文件系統存儲在引導扇區的第19和第20個字節中。

但是我不明白為什么

  retVal = *tmp1+((*tmp2)<<8); 
作品。 位<< 8將第二個字節轉換為十進制? 或大端格式? 為什么只對第二個字節而不對第一個字節呢?

有問題的字節為[little endian格式]:

40 0B

我嘗試通過先將順序切換到

0B 40

然后從十六進制轉換為十進制,然后得到正確的輸出,我只是不明白如何將第一個字節與第二個字節的按位移位相加呢? 謝謝

在這里,使用malloc()會嚴重誘發facepalm 完全沒有必要,並且有嚴重的“代碼異味”(使我懷疑代碼的整體質量)。 同樣, mmap顯然應該是unsigned char (或者甚至更好的是uint8_t )。

就是說,您要查詢的代碼非常簡單。

給定兩個字節大小的值ab ,有兩種方法將它們組合為一個16位值(這是代碼正在執行的操作):您可以將a視為最低有效字節,或者b

使用框,16位值可以看起來像這樣:

+---+---+
| a | b |
+---+---+

或類似這樣,如果您改為將b視為最高有效字節:

+---+---+
| b | a |
+---+---+

lsbmsb為16位值的方法很簡單:

result = (msb * 256) + lsb;

更新 :256來自於這樣的事實,那就是多字節數字中每個連續更高有效字節的“價值”。 將它與十進制數中10的作用進行比較(將兩個單位十進制數cd結合使用,您將使用result = 10 * c + d )。

考慮msb = 0x01lsb = 0x00 ,則上述內容將是:

result = 0x1 * 256 + 0 = 256 = 0x0100

您可以看到, msb字節恰好在16位值的高位結束。

您的代碼使用<< 8向左進行按位移位,這與乘以2 8即256相同。

請注意,上面的result是一個值,即不是內存中的字節緩沖區,因此其字節序無關緊要。

我認為將單個數字或字節組合成較大的整數沒有問題。

讓我們用2位數字做十進制:1(最低有效)和2(最高有效):

1 + 2 * 10 = 21(10是系統基數)

現在讓我們用2位數字做base-256:0x40(最低有效)和0x0B(最高有效):

0x40 + 0x0B * 0x100 = 0x0B40(0x100 = 256是系統基礎)

但是,問題可能出在其他地方,即FAT12中如何存​​儲12位整數。

一個12位整數占用1.5個8位字節。 在3個字節中,您有2個12位整數。

假設您有0x12、0x34、0x56這3個字節。

為了提取第一個整數,您只需要取第一個字節(0x12)和第二個字節的4個最低有效位(0x04)並將它們組合如下:

0x12 + ((0x34 & 0x0F) << 8) == 0x412

為了提取第二個整數,您需要獲取第二個字節(0x03)和第三個字節(0x56)的4個最高有效位,並像這樣組合它們:

(0x56 << 4) + (0x34 >> 4) == 0x563

如果您閱讀有關FAT的Microsoft官方文檔(在線查找fatgen103 ), fatgen103找到所有與FAT相關的公式/偽代碼。

<<運算符是左移運算符。 它將值帶到運算符的左側,然后將其移動以運算符右側使用的數字。

因此,在您的情況下,它將*tmp2的值向左移動八位,並將其與*tmp1的值組合以從兩個八個位的值生成一個16位的值。

例如,假設您有整數1 這是16位二進制數0000000000000001 如果將其左移八位,則最終得到二進制值0000000100000000 ,即十進制為256

表示形式 (即二進制,十進制或十六進制)與之無關。 所有整數都以相同的方式存儲在計算機上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM