C ++ Передача байтов от символа * к байту * - PullRequest
0 голосов
/ 07 февраля 2019

Я хотел бы знать, как передать / скопировать последовательность байтов, представленную как char* в BYTE* в C ++ в Windows.

Допустим, у меня есть это char*:

const char *ByteString = "\x3B\xC8\x74\x1B"  

Как бы я скопировал каждый байт с этого символа * на BYTE *Bytes и наоборот?

РЕДАКТИРОВАТЬ: Большое спасибо всем за помощь!

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

В MSVC (я полагаю, это ваш компилятор для приложения WinAPI), вы можете сделать тип char без знака с параметром /J (подробнее здесь: https://docs.microsoft.com/en-us/cpp/build/reference/j-default-char-type-is-unsigned?view=vs-2017). Если вы сделаете это, BYTE станеттак же, как char, и преобразование не требуется.

Обратите внимание, что это может иметь некоторые другие побочные эффекты в вашем приложении.

0 голосов
/ 07 февраля 2019

Определение 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";
}
0 голосов
/ 07 февраля 2019

Учитывая массив символов char const *, мы можем создать новый буфер с readwrite BYTE s для API для возможного редактирования:

char const *ByteString = "\x3B\xC8\x74\x1B";
auto len = std::strlen(ByteString) + 1;
auto ptr = std::make_unique<BYTE[]>(len);
std::memcpy(ptr.get(), ByteString, len);

Если вам необходимо отказаться от владения памятьюк функции:

Func(ptr.release());

Но если вы хотите сохранить право собственности самостоятельно:

Func(ptr.get());
0 голосов
/ 07 февраля 2019

Для соблюдения const, используйте

const BYTE *Bytes = reinterpret_cast<const BYTE*>(ByteString);

и наоборот:

const char *ByteString = reinterpret_cast<const char *>(Bytes);

Если вы хотите сделать копию буфера, чтобы вы могли изменить его, используйте

len = LenOfChrStr;
BYTE *Bytes = new BYTE[len];
memcpy(Bytes, ByteStr, len);
...