我一直在写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'绝对不会混淆任何东西。问题在别处。 –