는 C

2012-03-29 3 views
1
내가 데이터 구조 다음 한 이진 데이터 파일의 신기원 시간을 찾을 필요가

에 포장 BIT 구조에서 EPOCH 시간 값을 얻기 위해 (이것은 12 바이트 구조) 필드 -1과 필드 -2 나는 쉽게 빼낼 수 있으므로 문제가 없습니다. 다음과 같이 바이트 단위 -5,6,7,8- 3 포장 4 되었기 때문에는 C

I은 ​​에포크 시간 (길이)의 시간 값을 필요

  • 바이트 5~8 (32 비트 워드) 0에서 31까지의 시간 값 비트를 압축합니다 (바이트 5는 0에서 7 비트, 바이트 6은 8에서 15, 바이트 7은 16에서 23, 바이트 8은 24에서 31).

다음 시간 값의 나머지 10 비트 바이트 3 바이트 4에 포장되어

  • 바이트 3 2 비트 갖는다 : 32, 33, 바이트 4는 나머지 비트들을 갖는다 : 34-41

따라서 시간 값의 총 비트는 위와 같이 42 비트입니다.

이 42 비트에서 나오는 에포크 값을 계산해야합니다. 어떻게해야합니까? 코드에서 다음

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; 

:

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; 

이 값을 얻을 수있는 방법이 있나요 그것은 나에게 올바른 가치를 제공

이 같은 짓을했지만 확실하지? 당신이 그것을 descibe로

+0

22 비트가 아닌 21 비트는 왜? 처음 두 비트 필드에 31 비트가있을 때 포장 된 것은 무엇입니까? 나머지 두 32 비트 필드가 이상하게 정렬되어 있습니까? –

+0

로컬'time_t '은 32 비트 또는 64 비트 수량입니까? 표시된 시간이 1970-01-01 00 : 00 : 00 + 00 : 00 일 때 42 비트 시간 값에 포함되는 값은 무엇입니까? 2012-03-29 07 : 33 : 55-08 : 00에 포함되는 가치는 무엇입니까? Unix 시스템의 경우 대답은 각각 0과 1333031635입니다. –

+0

우선, tmuNumber가 22 비트 (8 + 8 + 6)라고 생각합니다. 두 번째로, 원하는 ttime은 time1 뒤에 ttime2 비트가 올 것입니다. 그렇지 않습니까? 그럼 당신은 다음과 같은 일을해야한다고 생각합니다 :'uint64_t ttime = (((uint64_t) header1-> time1) << 32) + ((uint64_t) header1-> time2); ' – rbelli

답변

1

이 당신에게 가치를 줄 것이다 : 리틀 엔디안 시스템에서 해당 같은

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; 

작품을하지만.