我想知道如何在Windows中的C ++中将表示为char*
的字节序列传递/复制到BYTE*
。
假设我有这个char*
:
const char *ByteString = "\x3B\xC8\x74\x1B"
如何将每个字符从此char *复制到BYTE *Bytes
,反之亦然?
编辑:非常感谢大家的帮助!
答案 0 :(得分:5)
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";
}
答案 1 :(得分:2)
要尊重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);
答案 2 :(得分:1)
给定一个char const *
个字符数组,我们可以创建一个具有读写BYTE
的新缓冲区,以便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());
答案 3 :(得分:1)
在MSVC(我想这是您的WinAPI应用程序编译器)中,可以使char
类型使用/J
选项进行无符号签名(更多信息:https://docs.microsoft.com/en-us/cpp/build/reference/j-default-char-type-is-unsigned?view=vs-2017)。如果这样做,BYTE
与char
相同,则无需进行转换。
请注意,这可能会在您的应用程序中产生其他副作用。