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

时间:2019-02-07 19:09:48

标签: c++ arrays winapi char

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

假设我有这个char*

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

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

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

4 个答案:

答案 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数据时,这些将不需要任何转换。这是一个使用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";
}

答案 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)。如果这样做,BYTEchar相同,则无需进行转换。

请注意,这可能会在您的应用程序中产生其他副作用。