[英]How to properly read data from memory (memcpy)
我有一些表,例如一個表聲明為uint8_t keyLock[16];
,並將這些表的內容保存在MCU的閃存中。 在此內存中,其外觀如下所示:
Address Data
00190008 - BA98B694
0019000C - E854B6E7
00190010 - 9200B2C9
00190014 - 42F8B048
當我通過memcpy
函數( memcpy(keyLock, 0x00190008, 32);
)將閃存數據復制到表中時,表的內容最終以這種方式初始化:
keyLock = {
0xBA, 0x98, 0xB6, 0x94, 0xE8, 0x54, 0xB6, 0xE7,
0x92, 0x00, 0xB2, 0xC9, 0x42, 0xF8, 0xB0, 0x48
}
我希望目錄看起來像是這樣初始化的:
keyLock = {
0x94, 0xB6, 0x98, 0xBA, 0xE7, 0xB6, 0x54, 0xE8,
0xC9, 0xB2, 0x00, 0x92, 0x48, 0xB0, 0xF8, 0x42
}
我的memcpy()
調用有什么問題,如何如上所述將其編寫為用所需的內容填充表?
當您將4個字節的內存存儲為32個但值為BA98B694
整數時,哪個字節BA98B694
?
在您的問題中,您隱式地假設BA
字節排在最前面,但是在您的系統上, 94
似乎在最前面。
您的memcpy
所做的一切正確。 您的問題是您對字節順序的期望,或是Flash中表格的布局。
您可以通過簡單地交換每個4字節dword的順序來修復它。
void endian_4byte_swap( uint32_t* bytes ){
std::swap(bytes[0],bytes[3]);
std::swap(bytes[1],bytes[2]);
}
void endian_fix_table( uint32_t (&table)[16] ){
for(int i=0;i<4;++i)
endian_4byte_swap(&table[4*i]);
}
但這可以解決症狀而不是疾病。 真正的解決方法是假設您可以控制表格,將其固定在閃存中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.