Определение BYTE
:
typedef unsigned char BYTE;
, что не совпадает с const char
, поэтому вам нужно преобразовать его, но обратите внимание, что приведениеотойти const
от чего-то объявленного const
, чтобы начать с неопределенного поведения, и попытка фактически изменить данные представляет еще больший риск.
BYTE* Bytes = reinterpret_cast<BYTE*>(const_cast<char*>(ByteString));
Редактировать: я только что заметилчто преобразование const char*
в BYTE*
было исключено, но я пока оставлю это здесь.
Можно выполнить копирование данных (не как строки с нулевым символом в конце)как это:
const char ByteString[] = "\x3B\xC8\x74\x1B";
BYTE* Bytes = new BYTE[sizeof(ByteString)-1];
std::memcpy(Bytes, ByteString, sizeof(ByteString)-1);
// Use your Bytes
delete[] Bytes; // manual delete when you are done
Или лучше:
const char ByteString[] = "\x3B\xC8\x74\x1B";
std::basic_string<BYTE> Bytes( reinterpret_cast<const BYTE*>(ByteString), sizeof(ByteString)-1 );
// use Bytes
// Bytes.data() returns a BYTE*
// Bytes.size() returns the length.
Но, учитывая характер того, что вы делаете, вы, вероятно, можете пропустить эти преобразования и использовать массивправильного типа для начала:
BYTE Bytes[] = { 0xA1, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0x74, 0x1B };
или
std::basic_string<BYTE> Bytes({ 0xA1, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0x74, 0x1B });
Эти преобразования не потребуются, когда все, с чем вы имеете дело, это необработанные BYTE
данные.Вот пример использования ReadProcessMemory
и basic_string
для буфера и шаблона.
using BYTEstr = std::basic_string<BYTE>; // just for convenience
BYTEstr Buffer(1024, 0); // 1024 BYTES initialized with 0
BYTEstr Pattern({ 0xA1, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0x74, 0x1B });
ReadProcessMemory(hProcess, lpBaseAddress, Buffer.data(), Buffer.size(), &lpNumberOfBytesRead);
BYTEstr::size_type pos = Buffer.find(Pattern);
if (pos == BYTEstr::npos) {
std::cout << "Pattern not found\n";
} else {
std::cout << "Pattern found at position " << pos << "\n";
}