2016-11-09 3 views
2

장치에서 데이터를 로깅하고 시스템 시간 (밀리 초)으로 해당 데이터에 타임 스탬프를 지정하는 코드가 있습니다.fprintf 형식을 실수로 실행 취소합니다.

I는 다음과 같이 생성 된 타임 스탬프를 저장하는 uint64_t을 사용했다 :

 

fprintf(ptr,"%ld\n",(long)stamp0); 
 

:이 같은 (그것을 통해 생각없이) 파일에 타임 스탬프를 쓴 다음

 

struct timespec request; 
clock_gettime(CLOCK_REALTIME, &request); 
uint64_t stamp0 = (uint64_t)((uint64_t)request.tv_sec * 1000 + (uint64_t)request.tv_nsec/1000000); 
 

이제 내 파일에 1130802699처럼 보이지만, 1478599582064처럼 보이는 잘못된 타임 스탬프가 있습니다.

오류를 해결하기 위해 할 수있는 일이 있습니까?

답변

5

타임 스탬프 11308026991478599552523보다 1478599582064과 같아야합니다. 그렇다면

것은, 당신이 1 < < (32)의 적절한 배수를 추가하여 타임 스탬프를 복구 할 수 있습니다 (나는 당신의 long 32 비트라고 가정하고있어 잘린 값은 음의 범위로 이월하지 않는다). 이 경우 각 값에 344 배 또는 1477468749824을 더합니다.

32 비트 값이 6 주마다 롤오버되므로 파일이 더 긴 범위에 걸쳐있는 경우 약간 더 명료하게 작업해야 할 수 있습니다.


만약 내가 그 가치를 생각해 냈다면, 우리는 뒤로해야합니다.

우리는 우리가 (거의) int32_tuint64_t을 잘립니다 알고, 우리는 0xffffffff를 함께 마스킹 의미 몇 가지 합리적인 가정 (예 : 2의 보수 연산) 할 경우 : 해당의

stamp0 & 0xffffffff 

을 뺀로를
stamp0 - (stamp0 & 0xffffffff00000000) 

이 차이는 넓은 범위의 값에서 일정하며 실제 값과 예상 값의 차이와 거의 같습니다.

1478599582064 - 1130802699는 1477468779365 또는 0x15800007365입니다.

그래서 내가 다시 추가 할 오프셋 0x15800000000 생각합니다.

+0

감사합니다. 타임 스탬프가 일치하지 않아서 내가 옳다고 생각합니다. 운 좋게 1 시간 정도 밖에 걸리지 않았으므로 롤오버가 문제가되지 않아야합니다. '344' 값에 어떻게 도착했는지 설명해 주시겠습니까? – James

+0

고마워, 정말 도움이된다. 너는 나에게 많은 고통을 덜어 줬다. – James

관련 문제