如何将字符串转换为无符号字符数组 [关闭]
Posted
技术标签:
【中文标题】如何将字符串转换为无符号字符数组 [关闭]【英文标题】:How to convert string to unsigned char array [closed] 【发布时间】:2020-01-10 09:58:55 【问题描述】:如何转换以下字符串:
std::string str = "xasxdfxtg";
到下面这个无符号字符数组/字节数组
unsigned char char_arr[1024] = "\xas\xdf\xtg";
【问题讨论】:
提示:您的字符串不包含反斜杠 我明白了,让我把它们加倍。 那么您希望unsigned char
数组实际上包含反斜杠吗?然后你也可以在真正的 C 代码中用双反斜杠来写。
是的,只有单个反斜杠存储在无符号字符数组(字节数组)中。
这就是我的回答所提供的。 std::string
中的双打只是意味着“不要将其视为转义序列,而应视为文字反斜杠”。因此,对于双引号(非原始)C 字符串中的每对反斜杠,您最终在内存中只有一个字节包含 '\'
。
【参考方案1】:
使用适当的算法:std::copy()
,而不是 strcpy()
。
#include <algorithm>
#include <iostream>
#include <string>
int
main()
std::string str = "\\xas\\xdf\\xtg";
unsigned char char_arr[1024];
std::copy(str.cbegin(), str.cend(), char_arr);
std::cout << char_arr << '\n';
return 0;
输出:
\xas\xdf\xtg
【讨论】:
它将字符串存储为 "\\xas\\xdf\\xtg" 而不是 "\xas\xdf\xtg" 编辑您的帖子以阐明您真正想要的内容。我的代码做合乎逻辑的事情。 在这两种情况下,都没有存储带有双反斜杠的字符串。这是在非原始字符串中指示文字反斜杠的 C/C++ 语法。而不是使用单个反斜杠引入的转义序列。您可以简单地使用调试器进行测试,甚至只需将每个字节打印为整数。 我已经修改了问题。【参考方案2】:你可以这样做:
std::string s"\\xas\\xdf\\xtg";
unsigned char char_arr[1024] 0; // initialize with zeros to make sure after copy it's null terminated
for (int i = 0; i < s.size(); ++i)
char_arr[i] = s[i];
std::cout << char_arr; // outputs \xas\xdf\xtg
【讨论】:
是否将其存储为字节?或者作为 \\x00\\x00? 我不明白你的意思,你能澄清一下吗? 如果我声明 unsigned char char_arr[1024] = "\x00\x00" 它将值存储为字节,我相信您的方法将值存储为 "\\x00\\x00"跨度> 所以,我将其声明为unsigned char char_arr[1024] 0;
。这有效地将这个数组中的所有字节初始化为 0(不是'0'
字符,而是实际的 0); "\\x00\\x00..." 是一个字符串,它实际上包含字符 \
、x
、0
、\
、x
、0
。这将是内存中的一些非零数字(134、170、48...)
另外,我建议您进行一些阅读和研究,以了解计算机如何将数据存储在内存中,因为我相信您需要它才能充分了解您遇到的问题和所提供的解决方案。【参考方案3】:
我会这样做:
#include <string>
#include <cstring>
int main()
std::string str = "\\xas\\xdf\\xtg";
unsigned char char_arr[1024] 0;
std::strcpy((char*)char_arr, str.c_str());
return 0;
【讨论】:
这会将其存储为字节吗?【参考方案4】:你可以试试这个 strcpy。
#include <string>
#include <cstring>
int main()
string str ="\\xas\\xdf\\xtg" ;
unsigned char m_Test[20];
strcpy( (char*) m_Test, str.c_str() );
return 0;
【讨论】:
以上是关于如何将字符串转换为无符号字符数组 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章