Cześć, uczę się rusta i stwierdziłem, że spróbuję parsowania pliku PE.
Przy parsowaniu nagłówku DOS nie było problemu, natomiast przy nagłówku COFF, pojawił się rust ma problem z nałożeniem tablicy bajtów na strukturę. Nie rozumiem, dlaczego wcześniej zadziałało, a teraz jest z tym problem.
#[derive(Debug, Copy, Clone, Default)]
struct COFFHeader
{
Machine: u16, // 2
NumberOfSections: u16, // 2
TimeDateStamp: u32, // 4
PointerToSymbolTable: u32, // 4
NumberOfSymbols: u32, // 4
SizeOfOptionalHeader: u16, // 2
Characteristics: u16, // 2
// 20
}
fn test() -> COFFHeader{
let x:[u8;20] = [100, 134, 5, 0, 101, 201, 230, 96, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 34, 0];
let ptr = x.as_ptr() as *const COFFHeader;
return unsafe {ptr.read()};
}
Niestety, ale np pole Machine wynosi zero, a powinno 0x8664
Jednak jak spróbuje skonwertować pierwsze dwa bajty na u16
fn test2() -> u16 {
let x:[u8;20] = [100, 134, 5, 0, 101, 201, 230, 96, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 34, 0];
let ptr = x.as_ptr() as *const u16;
return unsafe {ptr.read()};
}
Dostaję wyniku poprawny wynik 0x8664
Nie mam pojęcia czemu to nie chce poprawnie zadziałać, tym bardziej, że przy wcześniejszym nakładaniu bajtów na strukturę nagłówka DOS, odbyło się to poprawnie.
Być może są lepsze sposoby na tworzenie struktury z tablicy bajtów?