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