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,反之亦然?
编辑:非常感谢大家的帮助!
定义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数据时,这些都不需要任何转换.这是一个使用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";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
335 次 |
| 最近记录: |