用户指定边界之间的字节测试

时间:2013-09-25 16:29:25

标签: c

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

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

1 个答案:

答案 0 :(得分:2)

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

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


便携式方法一次只能比较1个字节。


快速方法但有许多假设:
。分组数据和平台相同的endian和Little。
Boundary_width <= sizeof inttype
。无符号算术 。针对Packet_CompareMask()进行了优化 。在任何字节边界上访问宽度整数OK 。单击确定可以访问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);
}