所以我一直在尝试获取驱动器的mbr的LBA。我已经找到了正确的 LBA 索引号。这些数字已经是十六进制格式,我已经将它们分配给一个数组。当我尝试将数组转换为单个十六进制数字的 uint32_t 整数时,我得到了错误的答案。
` 为(i=446;i<512;i++) { fprintf(stdout, "%2x ",b[i]);
if(i == 486 || i == 487 || i == 488 || i == 489)
{
//debugging
LBAAddr[LBAByteNum] = b[i];
LBAByteNum ++;
}
} `
这是我获取 LBA 地址的地方
for(int i =0; i< 4; i++)
{
printf("%2x", nums[i]);
finalNum = (nums[i] << (8*i+1) ) | nums[i+1];
printf("\n%x", finalNum);
}
我试图将数字向左移动以将其转换为单个十六进制数字。
例如,如果 for 循环打印出 0 0 0 0,我将其分配给数组。但当我转换它时,我得到 4e9052eb。
对于格式错误,我深表歉意,但非常感谢您的帮助! 谢谢!
您需要知道数组的字节序和您的 uint32_t。
uint32_t convert(unsigned char *array, int endianess)
{
endianess == !!endianess;
uint32_t result = 0;
for(size_t index = 0; index < sizeof(result); index++)
{
printf("%d\n", 24 * endianess + 8 * index * (!endianess * 2 + -1));
result += ((uint32_t)array[index]) << (24 * endianess + 8 * index * (!endianess * 2 + -1));
}
return result;
}
int main(void)
{
unsigned char arr[] = {0xaa,0xbb,0xcc,0xdd};
printf("%"PRIx32"\n", convert(arr, 0));
printf("%"PRIx32"\n", convert(arr, 1));
}