[英]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
)。
就是說,您要查詢的代碼非常簡單。
給定兩個字節大小的值a
和b
,有兩種方法將它們組合為一個16位值(這是代碼正在執行的操作):您可以將a
視為最低有效字節,或者b
。
使用框,16位值可以看起來像這樣:
+---+---+
| a | b |
+---+---+
或類似這樣,如果您改為將b
視為最高有效字節:
+---+---+
| b | a |
+---+---+
將lsb
和msb
為16位值的方法很簡單:
result = (msb * 256) + lsb;
更新 :256來自於這樣的事實,那就是多字節數字中每個連續更高有效字節的“價值”。 將它與十進制數中10的作用進行比較(將兩個單位十進制數c
和d
結合使用,您將使用result = 10 * c + d
)。
考慮msb = 0x01
和lsb = 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.