나는 R2K 객체 모듈에 쓰기 작업을 해왔고, 심볼 테이블 엔트리를 파일에 쓰는데 어려움을 겪고있다. 나는 memcpy를 사용하여 sym_table에 저장된 심볼 테이블의 항목을 bytes_sym이라는 1 바이트 정수로 배열 한 다음 파일에 씁니다. 올바른 크기를 복사하지만 어떤 이유로 바이트 배치가 뒤죽박죽입니다. 쓰기 전에 바이트 값은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
나는 여기에 내 코드입니다 이 문제의 원인에 대해 머리를 감쌀 수 없으므로 도움이 될 것입니다.
스택 오버플로에 오신 것을 환영합니다. 곧 [About] 및 [Ask] 페이지를 읽으십시오. 데이터 구조는 어떻게 생겼습니까? 우리는 그것에 대해 알아야합니다. MCVE ([MCVE])를 만드는 방법에 대해서도 읽어보십시오. –
코드 작성 및 데이터 읽기도 살펴 보시겠습니까? 또한'0x % x'을'0x % 02x'로 만듭니다. – alk
빅 엔디안 대 리틀 엔디안 문제처럼 보입니다. 우리는 더 많은 정보가 필요합니다. 특히 [MCVE]가 도움이 될 것이지만,'memcpy'는 분명히 어떤 것도 혼합하지 않을 것입니다. 문제는 다른 곳에있다. –