C ++如何将字符串字符转换为精确的十六进制字节

C++ how to convert string characters to exact hex bytes

首先:我有一个应用程序需要一个字节数组并从中加载程序集。

我的想法,为了防止(容易)盗版,是在服务器上有一个加密的字符串,在客户端下载它,解密它以获得例如: std::string decrypted = "0x4D, 0x5A, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4";

然后从字符串转换为二进制(字节数组),这样就可以了

uint8_t binary[] = { 0x4D, 0x5A, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4 };

然后像以前一样继续,但是经过大量谷歌搜索后,我找不到太多关于常规字符串和字节数组之间直接转换的信息。 感谢您的任何帮助! -莎拉

您可以在循环中使用 std::stoi

它给你数字的结束位置,然后你可以用它来检查字符串是否在它的末尾,或者它是否是一个逗号。如果是逗号,请跳过它。然后使用该位置作为要解析的字符串再次调用 std::stoi

它不是最有效的,但应该可以正常工作。

首先,你应该去掉“,”。然后你可以逐个解析一个字符,对每个第二个字符进行按位左移并保存为 byte

char firstchar = HexCharToByte('5');
char secondchar = HexCharToByte('D');
char result = firstchar | (secondchar << 4);
printf("%%hhu", result); //93

HexCharToByte 所在的位置(仅限上部字符):

char HexCharToByte(char ch) => ch > 57 ? (ch - 55) : (ch - 48);

这是解析十六进制字符的足够快的方法。

使用std::stoul 将字符串解释为无符号整数。然后可以将无符号整数转换为 uint8_t 类型。

解析整个字符串的一种方法是使用字符串流。

代码示例:

#include <cstdint>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

int main()
{
    // Input string and output vector
    std::string const decrypted{"0x4D, 0x5A, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4"};
    std::vector<std::uint8_t> bytes;

    // Parse the string and fill the output vector
    std::istringstream decryptedStringStream{decrypted};
    std::string decryptedElement;
    while (getline(decryptedStringStream, decryptedElement, ','))
    {
        auto const byte = static_cast<std::uint8_t>(std::stoul(decryptedElement, nullptr, 16));
        bytes.push_back(byte);
    }

    // Print the results (in base 10)
    for (auto const &e : bytes)                                                                             
        std::cout << static_cast<int>(e) << '\n';
}