比较GPS时间戳的有效方法

时间:2017-11-27 19:59:06

标签: c timestamp

我的目标是比较GPS设备提供的两个u_long时间戳。像16290212这样的长整数具有以下结构:

  

hhmmssμμ

以下代码段显示了如何将长整数解析为整数数组的方法。但我认为这不是很有效率。比较两个时间戳的最快方法是什么?我很想使用UNIX时间戳,但在这种情况下不可能。

u_long timestamp_old = 16290212;

u_long base = 1000000;

/* arr[0]: hours
 * arr[1]: minutes
 * arr[2]: seconds
 * arr[3]: miliseconds */
int arr[4];
int i=0;

// parse timestamp_old
while(base >= 1)
{
    arr[i++] = (timestamp_old / base);

    timestamp_old = (timestamp_old % base);

    base /= 100;
}

2 个答案:

答案 0 :(得分:2)

  

比较两个时间戳的最快方法是什么?   我想检查差异是否小于400毫秒

也许不是最快的,但至少是一个快速最坏情况的起点。请注意,ssµµµµµµµµ相同。

int32_t GPS_to_ms(u_long timestamp) {
  int32_t ms = timestamp%100000;
  int32_t hhmm = timestamp / 100000;
  ms +=  (hhmm%100)*60*1000;
  int32_t hh = hhmm / 100;
  ms +=  hh*60*60*1000;
  return ms;
}

if (GPS_to_ms(timestamp_later) - GPS_to_ms(timestamp_first) < 400) {
  // timestamps are in close succession.
}

为了加快平均值,1)假设timestamp_later >= timestamp_first 通常是2)时间戳通常具有相同的hhmm

bool GPS_compare_400(u_long first, u_long later) {
  int32_t ms1 = first%100000;
  int32_t hhmm1 = first/100000;
  int32_t ms2 = later%100000;
  int32_t hhmm2 = later/100000;
  if (hhmm1 == hhmm2) {
    return ms2 - ms1 < 400;
  }
  return GPS_to_ms(timestamp_later) - GPS_to_ms(timestamp_first) < 400;
}

答案 1 :(得分:0)

我假设输入是“hhmmssμμμ”形式的字符串gpstime。我假设总是存在尾随零,这样微秒部分总是有三个数字。

1

int h, m, s, us;
double t;
if(sscanf(gpstime, "%2d%2d%2d%3d", &h, &m, &s, &us) == 4)
    t = (h * 60L + m) * 60 + s + us/1000.;
else {
    /* parse error */
    t = 0;
}

如果这还不够有效,那么这里就是肮脏的,回避scanf

2

#define Ctod(c) ((c) - '0')

int h = 10 * Ctod(utctime[0]) + Ctod(utctime[1]);
int m = 10 * Ctod(utctime[2]) + Ctod(utctime[3]);
int s = 10 * Ctod(utctime[4]) + Ctod(utctime[5]);
int us = 100 * Ctod(utctime[6]) + 10 * Ctod(utctime[7]) + Ctod(utctime[8]);
double t = (h * 60L + m) * 60 + s + us/1000.;

在任何一种情况下,一旦获得t值,只需像往常一样减去并进行比较。

如果您不想使用浮点数,请将t更改为long int,根据需要更改比例因子,并将最终差异与400进行比较,而不是{{1 }}

(但是所有这些都说过,我不会太担心效率。对于一个可怜的人来说,10赫兹可能听起来很快,但十分之一秒对于一台体面的计算机来说是一段很长的时间。)