簡體   English   中英

如何正確地從內存中讀取數據(memcpy)

[英]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.

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