kyrsjo Skrevet 23. november 2009 Del Skrevet 23. november 2009 (endret) Hei! Jeg holder på å skrive et program (i Python) som dekoder et binært filformat. Jeg har et C++-program å se på. C++-programmet leser fila i ord på fire bytes (som unsigned int). Dette er stort sett forståelig og fint, men et sted i programmet så tar den en slik byte og lagrer den til et array av type "Short_t" (2 byte signed int). Dette skjer ved en implisitt konvertering: m_n_pedestal[strip] = *(dataPointer); hvor dataPointer er et objekt av en fancy klasse for random-access i en fil, og operator* i dataPointer gir deg en unsigned int som er det ordet dataPointer peker på. m_n_pedestal er definert slik: Short_t m_n_pedestal[NUM_STRIPS]; Hva skjer? Ser den bare på de første 2 bytene, og leser de som en short? Hva skjer med fortegnet? Endret 23. november 2009 av kyrsjo Lenke til kommentar
GeirGrusom Skrevet 23. november 2009 Del Skrevet 23. november 2009 Jeg forstår ikke helt hva som foregår her, men casting fra int til short skal gi deg en warning i compileren (siden det vil føre til potensiell tap av data) Lenke til kommentar
kyrsjo Skrevet 23. november 2009 Forfatter Del Skrevet 23. november 2009 Den opprinnelige koden gjør det, men jeg vet ikke hvordan den kompileres. Uansett: Tenkte som så at det er little-endian data til å begynne med, så jeg leser de to første bytene i fire-byte ordet. Det så ut til å gå bra, og gav resultater som ikke så alt for gale ut. De to siste bytene så ut til å alltid være 0x0000, noe som ikke gav så veldig mye mening. Den endelige python-koden blei dermed: print "\t\t\t\t N-side:" stripNum = 0 print "\t\t\t\t\t | strip | pedestal | noise | threshold |" while pos < 3*BAT_strips+1: stripCalib = dataData[pos*4:(pos+3)*4] pedestal = struct.unpack('<h', stripCalib[0:2])[0] noise = struct.unpack('<h', stripCalib[4:6])[0] threshold = struct.unpack('<h', stripCalib[8:10])[0] print "\t\t\t\t\t | %03d | %06d | %03d | %04d |" \ % (stripNum, pedestal, noise, threshold) stripNum += 1 pos += 3 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå