gpt4 book ai didi

c++ - 无符号字符的字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:08:17 24 4
gpt4 key购买 nike

这是一个有趣的例子。我正在编写 AES 加密算法,并设法让它进行准确的加密。当我试图将结果写入文件时,麻烦就来了。我得到的文件输出不正确。十六进制值会被破坏,这通常是荒谬的(即使按照加密标准)。

我通过在将加密输出发送到文件之前对其进行采样来进行一些调试。我发现我在某处遇到了某种类型的溢出。当正确的十六进制值应该是 9e 时,我会得到 ffffff9e。它只会对 7F 以上的十六进制值执行此操作,即“扩展”字符集中的字符未得到正确处理。这在我的项目早期也发生在我身上,然后问题是使用 char[][] 容器而不是 unsigned char[][] 容器。

我的代码使用字符串在用户界面和 AES 加密类之间传递加密数据。我猜 std::strings 不支持扩展字符集。所以我的问题是:有没有办法实例化一个无符号字符串,或者我是否必须找到一种方法来替换我对字符串的所有使用?

最佳答案

std::string实际上只是一个 typedef,类似于:

namespace std { 
typedef basic_string<char> string;
}

unsigned char 创建变体相当容易:

typedef basic_string<unsigned char> ustring;

但是,您必须更改代码才能使用 ustring (或您喜欢的任何名称)而不是 std::string尽管。

根据您编写代码的方式,可能虽然不需要编辑所有代码。特别是,如果你有类似的东西:

namespace crypto { 
using std::string;

class AES {
string data;
// ..
};
}

您可以通过仅更改 using 来更改字符串类型声明:

namespace unsigned_types { 
typedef std::basic_string<unsigned char> string;
}

// ...

namespace crypto {
using unsigned_types::string;

class AES {
string data;
};
}

另请注意,模板的不同实例化是完全不同的类型,即使实例化它们的类型是相关的,所以您可以在 char 之间隐式转换。和 unsigned char并不意味着您会在 basic_string<char> 之间获得匹配的隐式转换和 basic_string<unsigned char> .

关于c++ - 无符号字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294746/

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