0

我正在尝试检查数据包有效负载中的特定字节并测试它们是否 >,<,!, = 到指定值。边界点是动态的,评估它们之间的字节的最佳方法是什么?

例如,我有一个带有有效负载的数据包(当然在标头之后),我想在字节 5 和字节 10 之间进行评估,以查看它是否大于某个指定值。

4

1 回答 1

2

的返回值memcmp()做了一个很好的无符号小端比较。

return memcmp(&packet[IndexLo], &Reference, IndexHi - IndexLo + 1);


一种可移植的方法将简单地一次比较 1 个字节。


快速方法但有许多假设
:数据包数据和平台相同的字节序和小。
. Boundary_width <= sizeof inttype.
. 无符号算术。
. 针对Packet_CompareMask().
. 在任何字节边界上访问宽度整数都可以。
. 可以访问刚刚结束的内存packet

typedef uint64_t inttype;

int Packet_CompareMask(const char *packet, size_t IndexLo, unint64_t Mask, inttype Reference) {
   // This fails on machine with alignment restricts on wide integers.
   inttype x = *((inttype *) &packet[IndexLo]);
   x &= Mask;
   if (x < Reference) return -1;
   return x > 0;
}

int Packet_CompareRange(const void *packet, size_t IndexLo, size_t IndexHi, inttype Reference) {
  inttype Mask = 0;
  ssize_t Diff = IndexHi - IndexLo;
  if ((Diff <= 0) || (Diff > (sizeof(Mask) - 1))) {
    ; // handle error
  }
  // This only works on little endian machines.  A variant would work with Big endian.
  while (--Diff >= 0) {
    Mask <<= 8;
    Mask |= 0xFF;
    }
  return Packet_CompareRange(packet, IndexLo, Mask, Reference);
}
于 2013-09-25T17:38:18.037 回答