在指针中搜索值:给定 uint8_t 指针内存起始位置和大小读取 4 个字节

Searching for value in pointer: Reading 4 bytes given uint8_t pointer memory start location and size

我试图在一大块内存中搜索一个 4 字节的十六进制值 (0xAABBAABB),然后将其之前的 4 个字节复制到一个单独的变量中。

0xAABBAABB 是消息终止符,我在这之前的 4 个字节之后。

我从 *uint8_t 和消息大小给出了内存中数据位置的起始位置。所以 *uint8 包含消息的前 2 个字节。

任何帮助将不胜感激。

谢谢

我不会为您编写完整的代码,但是如果您可以读取 2 个字节,那么读取 4 个字节将非常简单。只需读取 2 个字节,移位并再次读取 2 个字节。假设 readUInt8(); 从您的消息中返回 2 个字节。

std::uint16_t readUInt16()
{
    const std::uint16_t firstByte = readUInt8();
    const std::uint16_t secondByte = readUInt8();

    std::uint16_t value = 0;
    value |= firstByte << 8;
    value |= secondByte;

    return value;
}

然后检查是否 readUInt16() == 0xAABBAABBu 如果是则取前 4 个字节。请记住检查消息大小是否与 4 个字节对齐。

尝试这样的事情:

uint8_t *msg = ...;
int msgsize = ...;

...

uint8_t bytes[4];
bool found = false;

msg += 4;
msgsize -= 4;
while (msgsize >= 4)
{
    if (*(uint32_t*)msg == 0xAABBAABB)
    {
        memcpy(bytes, msg-4,  4);
        found = true;
        break;
    }

    ++msg;
    --msgsize;
}

或者这样:

uint8_t *msg = ...;
int msgsize = ...;

...

const uint8_t term[4] = {0xAA, 0xBB, 0xAA, 0xBB};
uint8_t bytes[4];
bool found = false;

msg += 4;
msgsize -= 4;
while (msgsize >= 4)
{
    if (memcmp(msg, term, 4) == 0)
    {
        memcpy(bytes, msg-4,  4);
        found = true;
        break;
    }

    ++msg;
    --msgsize;
}