这是一个有趣的.我正在编写AES加密算法,并设法使它进行准确的加密.当我尝试将结果写入文件时,麻烦就来了.我正在获取输出错误的文件.十六进制值将被破坏,并且通常只是荒谬的(即使是按加密标准).
在将加密输出发送到文件之前,我通过采样加密输出进行了一些调试.我发现我在某处出现某种类型的溢出.当正确的十六进制值为9e时,我将得到ffffff9e.只会对7F以上的十六进制值执行此操作,即“扩展”字符集中的字符未正确处理.这在我的项目中也曾发生过,当时的问题是使用char [] []容器而不是未签名的char [] []容器.
我的代码使用字符串在用户界面和AES加密类之间传递加密的数据.我猜std :: strings不支持扩展字符集.所以我的问题是:是否可以实例化未签名的字符串,还是我必须找到一种方法来替换所有使用的字符串?
解决方法:
std :: string实际上只是一个typedef,类似于:
namespace std {
typedef basic_string<char> string;
}
为无符号字符创建变体非常容易:
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>.