我正在试图检查数据包有效负载中的特定字节,并测试它们是否是>,<,!,=到指定值。边界点是动态的,评估它们之间字节的最佳方法是什么?
例如,我有一个带有效负载的数据包(当然是在标题之后),我想在字节5和字节10之间进行评估,看它是否大于某个指定值。
答案 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);
}