我一直在寫R2K對象模塊,並且在符號表條目寫入文件時遇到了麻煩。我一直試圖使用memcpy將存儲在sym_table中的符號表條目放入一個名爲bytes_sym的字節整數的數組中,然後將其寫入文件。它複製正確的大小,但由於某種原因而亂放字節的位置。這裏是我的代碼:memcpy混合結構的內容?
/*
** symbol table entry
*/
typedef
struct syment {
uint32_t flags; /* flag word */
uint32_t value; /* value associated with this symbol */
uint32_t sym; /* symbol name's index into string table */
}
syment_t;
// header->data[8] is the number of symbol table entries
int sym_length = header->data[8] * sizeof(syment_t);
uint8_t bytes_sym[sym_length];
for(int i = 0; i < header->data[8]; i++){
memcpy(&bytes_sym[i * sizeof(syment_t)], &sym_table[i], sizeof(syment_t));
}
fwrite(bytes_sym, sym_length, 1, file);
// prints the newly copied symbol table section one byte at a time
// I know it's gross to look at, but it's only for testing :p
printf("New Symtab:\n");
for(int i = 0; i < sym_length; i++){
printf("0x%x ", bytes_sym[i]);
}
printf("\n");
寫作之前,該字節的值是:
0x0 0x0 0x0 0xb1 0x0 0x40 0x0 0x2c 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0xa3 0x10 0x0 0x0 0x20 0x0 0x0 0x0 0x5
0x0 0x0 0x40 0xb1 0x0 0x40 0x0 0x38 0x0 0x0 0x0 0xb
0x0 0x0 0x0 0xa1 0x0 0x40 0x0 0x14 0x0 0x0 0x0 0x10
0x0 0x0 0x40 0xb1 0x0 0x40 0x0 0x0 0x0 0x0 0x0 0x15
0x0 0x0 0x0 0x67 0x0 0x0 0x0 0x11 0x0 0x0 0x0 0x1f
0x0 0x0 0x0 0xa2 0x10 0x0 0x0 0x0 0x0 0x0 0x0 0x19
0x0 0x0 0x40 0xb1 0x0 0x40 0x0 0x64 0x0 0x0 0x0 0x29
寫入後,他們(不正確的,不應該是不同的):
0xb1 0x0 0x0 0x0 0x2c 0x0 0x40 0x0 0x0 0x0 0x0 0x0
0xa3 0x0 0x0 0x0 0x20 0x0 0x0 0x10 0x5 0x0 0x0 0x0
0xb1 0x40 0x0 0x0 0x38 0x0 0x40 0x0 0xb 0x0 0x0 0x0
0xa1 0x0 0x0 0x0 0x14 0x0 0x40 0x0 0x10 0x0 0x0 0x0
0xb1 0x40 0x0 0x0 0x0 0x0 0x40 0x0 0x15 0x0 0x0 0x0
0x67 0x0 0x0 0x0 0x11 0x0 0x0 0x0 0x1f 0x0 0x0 0x0
0xa2 0x0 0x0 0x0 0x0 0x0 0x0 0x10 0x19 0x0 0x0 0x0
0xb1 0x40 0x0 0x0 0x64 0x0 0x40 0x0 0x29 0x0 0x0 0x0
我只是無法包裹我的頭,因此任何幫助都將非常感謝!
歡迎來到Stack Overflow。請儘快閱讀[關於]和[問]頁面。數據結構是什麼樣的?我們需要知道這一點。另請閱讀如何創建MCVE([MCVE])。 –
所以你想看看編寫代碼和讀取數據呢?同時使'0x%x'成爲'0x%02x'。 – alk
看起來像一個大的endian vs小端的問題。我們需要更多信息, 特別是[MCVE]會有幫助,但是'memcpy'絕對不會混淆任何東西。問題在別處。 –