gpt4 book ai didi

c++ - 当转换为 PUCHAR 并打印到控制台时,硬编码字符串给出的结果与从控制台读取的字符串不同

转载 作者:行者123 更新时间:2023-11-30 05:01:19 24 4
gpt4 key购买 nike

我完全被蒙蔽了。我一直在寻找几个小时为什么我不能将字符串转换为 PUCHAR(unsigned char*)。这很奇怪,但出于某种原因,Windows 加密方法只接受 PUCHAR 的...(为什么?)

我找到了很多解决方案,但起初它们似乎都行不通。 ASCII 表中的前 128 个字符工作正常,但其他字符如 'ù' 和 'µ' 被转换为其他字符(大多数是奇怪的 ASCII 符号,但对应给定字符总是相同的符号)。

我现在才发现转换确实有效,但仅适用于使用 cin 从控制台读取的字符串?!硬编码字符串不起作用?!老实说,我对这种行为的原因一无所知。

这是一个例子:

使用 CIN

cout << "With cin: ";
string password;
cin >> password;
unsigned char q = (unsigned char)password[0];
PUCHAR pbPassword = new unsigned char[1];
pbPassword[0] = q;
pbPassword[1] = NULL; //Null or garbage is printed
cout << pbPassword;

这个输出:

用 cin:

µ
µ

无 CIN

cout << "Without cin: ";
string password = "µ";
unsigned char q = (unsigned char)password[0];
PUCHAR pbPassword = new unsigned char[1];
pbPassword[0] = q;
pbPassword[1] = NULL;
cout << pbPassword;

这个输出:

Without cin: ╡

我是一个新手程序员,如果代码很乱,我很抱歉。

虽然我使用相同的字符,但硬编码字符串的转换不起作用。即使使用完全相同的转换。

我还注意到,我可以将一个字符放在索引 1 处,而数组的长度仅为 1,这意味着我正在访问我实际上不应该访问的内存。这怎么可能?通常这会导致某种内存访问错误,对吧?

编辑:主要问题不是如何转换,或者为什么我仍然可以将元素放入数组,即使它的长度为 1。这就是为什么 cout 对从 cin 读取的字符串和硬编码字符串的转换给出不同的结果.

最佳答案

您的字符串文字可能是在保存源文件的任何代码页中编码的。当您打印这些字符串时,它们会显示在控制台的代码页中。

从控制台读取的字符串将进入控制台的代码页,因此在发送回控制台时将正确打印。

在 Windows 上,如果你想在控制台上读取或写入非 ascii 字符,你应该使用 std::wcinstd::wcout with std::wstring 来避免这个问题。然后,如果需要,您可以将 std::wstring 转换为 utf-8 或 1 字节代码页之一。

关于c++ - 当转换为 PUCHAR 并打印到控制台时,硬编码字符串给出的结果与从控制台读取的字符串不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50350921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com