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';
}
首先:我有一个应用程序需要一个字节数组并从中加载程序集。
我的想法,为了防止(容易)盗版,是在服务器上有一个加密的字符串,在客户端下载它,解密它以获得例如:
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';
}