在指针中搜索值:给定 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;
}
我试图在一大块内存中搜索一个 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;
}