2012-03-29 4 views
1

Ich brauche die Epoch Zeit aus einer binären Datendatei, um herauszufinden, welche Datenstruktur hat folgende (es ist eine 12-Byte-Struktur):So zu erhalten EPOCH Zeit Wert von einer Verpackt BIT Struktur in C

Field-1 : Byte 1, Byte 2, + 6 Bits from Byte 3 
Time-1 :     2 Bits from Byte 3 + Byte 4 
Time-2 : Byte 5, Byte 6, Byte 7, Byte 8 
Field-2 : Byte 9, Byte 10, Byte 11, Byte 12 

Für Field-1 und Field-2 Ich habe kein Problem, da sie leicht herausgenommen werden können.

Ich benötige Zeitwert in Epoch Time (lang), wie es in Bytes 5,6,7,8 und 3 und 4 geliefert wurde, wie folgt:

  • Bytes 5 bis 8 (32-Bit-Wort) Packt Zeitwertbits von 0 bis 31 (Byte 5 hat 0 bis 7 Bits, Byte 6 hat 8 bis 15, Byte 7 hat 16 bis 23, Byte 8 hat 24 bis 31).

Die verbleibenden 10 Bits des Zeitwertes in Byte 3 und Byte 4 gepackt, wie folgt:

  • Byte 3 2 Bits hat: 32 und 33, und 4 Byte hat verbleibenden Bits: 34 bis 41

Also insgesamt Bits für den Zeitwert ist 42 Bits, wie oben verpackt.

Ich muss Epoch Wert aus diesen 42 Bits berechnen. Wie mache ich es?

Ich habe etwas getan, aber nicht sicher, ob es mir korrekten Wert gibt:

typedef struct P_HEADER { 
    unsigned int tmuNumber : 22; //sorry for the typo. 
    unsigned int time1 : 10; // Bits 6,7 from Byte-3 + 8 bits from Byte-4 
    unsigned int time2 : 32; // 32 bits: Bytes 5,6,7,8 
    unsigned int traceKey : 32; 
} __attribute__((__packed__)) P_HEADER; 

Dann im Code:

P_HEADER *header1; 

//get input string in hexa,etc..etc.. 
//parse the input with the header as : 
header1 = (P_HEADER *)inputBuf; 
// then print the header1->time1, header1->time2 .... 
long ttime = header1->time1|header1->time2; 

Ist dies die Art und Weise Werte raus?

+0

Warum 21 und nicht 22 Bits? Was macht gepackt, wenn Sie 31 Bits in den ersten zwei Bitfeldern haben? Sind die verbleibenden zwei 32-Bit-Felder seltsam ausgerichtet? –

+0

Ist Ihre lokale 'time_t' eine 32-Bit- oder 64-Bit-Menge? Was enthält Ihr 42-Bit-Zeitwert, wenn die dargestellte Zeit 1970-01-01 00: 00: 00 + 00: 00? Welchen Wert enthält es für 2012-03-29 07: 33: 55-08: 00? Für Unix-Systeme lauten die Antworten 0 und 1333031635. –

+0

Zuerst denke ich, die tmuNumber ist 22 Bits (8 + 8 + 6), zweitens, die Zeit, die Sie wollen, wird time1 gefolgt von ttime2 Bits sein, nicht wahr? Dann denke ich, dass du Folgendes tun musst: 'uint64_t ttime = (((uint64_t) header1-> time1) << 32) + ((uint64_t) header1-> time2);' – rbelli

Antwort

1

Sie Dies wird den Wert geben, wie Sie es descibe:

wie das auf, obwohl Little-Endian-Maschinen nur
typedef struct P_HEADER { 
    unsigned int tmuNumber : 22; 
    unsigned int time1 : 10; // Bits 6,7 from Byte-3 + 8 bits from Byte-4 
    unsigned int time2 : 32; // 32 bits: Bytes 5,6,7,8 
    unsigned int traceKey : 32; 
} __attribute__((__packed__)) P_HEADER; 

long ttime = ((uint64_t)header1->time1) << 32 | header1->time2; 

Works.

Verwandte Themen