C++将字节从char*传递到BYTE*

Cat*_*ata 6 c++ arrays winapi char

我想知道如何在Windows中传递/复制表示为a的字节序列char*BYTE*C++中.

假设我有这个char*:

const char *ByteString = "\x3B\xC8\x74\x1B"  
Run Code Online (Sandbox Code Playgroud)

我如何将每个字节从此char*复制到a BYTE *Bytes,反之亦然?

编辑:非常感谢大家的帮助!

Ted*_*gmo 6

定义BYTE是:

typedef unsigned char BYTE;

这与a不同const char,所以你需要转换它,但请注意,抛弃const声明的东西会const导致未定义的行为并试图实际更改数据会带来更大的风险.

BYTE* Bytes = reinterpret_cast<BYTE*>(const_cast<char*>(ByteString));

编辑:我刚刚注意到,将a转换const char*为a 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
Run Code Online (Sandbox Code Playgroud)

或更好:

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.
Run Code Online (Sandbox Code Playgroud)

但鉴于您正在做的事情的性质,您可以跳过这些转换并使用正确类型的数组开头:

BYTE Bytes[] = { 0xA1, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0x74, 0x1B };
Run Code Online (Sandbox Code Playgroud)

要么

std::basic_string<BYTE> Bytes({ 0xA1, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0x74, 0x1B });
Run Code Online (Sandbox Code Playgroud)

当你处理的只是原始BYTE数据时,这些都不需要任何转换.这是一个使用ReadProcessMemorybasic_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";
}
Run Code Online (Sandbox Code Playgroud)