我试图解决在c ++中训练的简单任务:xor加密/解密。但是我的 var
Hash: TIdHMACSHA256 ;
HashValue: TBytes;
begin
SetCurrentDir(ExtractFilePath(ParamStr(0)));
Hash := TIdHMACSHA256 .Create;
try
Hash.Key := TEncoding.ASCII.GetBytes('devaee2');
HashValue := Hash.HashValue(TFile.ReadAllBytes('menu.xml'));
// HashValue is an empty array, why?
Tag := Length(HashValue);
TFile.WriteAllBytes('menu.xml.hash', HashValue);
finally
FreeAndNil(Hash);
end;
end;
函数无法正常工作。它创建的结果字符串具有奇怪的长度,比原始的更少或更多。我不明白,为什么。我试图将gamma()
添加到结果字符串的末尾,但它不起作用。
我的\0
功能
gamma()
我原来的字符串是
void gamma(char *s1, char *s2, char *res)
{
for (int i = 0; i < strlen(s1); i++) {
res[i] = s1[i] ^ s2[i];
}
char source[255] = "1234", key[255] = "avsc", result[255];
使用gamma()
创建一个奇怪的字符串。
输出示例:
length=5
答案 0 :(得分:1)
对于二进制数据使用char*
或std::string
并不是一个好主意,因为它假设许多地方保留零终止字符串。 (对于std::string
它实际上更好,但仍有一些问题),所以最好使用std::vector<unsigned char>
二进制数据:
typedef std::vector<uin8_t> data;
data gamma( const std::string &str, const std::string &key )
{
data r( str.length() );
for( size_t i = 0; i < str.length(); ++i )
r[i] = str[i] ^ key[i%key.length()];
return r;
}
答案 1 :(得分:0)
将您的功能更改为
void gamma(char *s1, char *s2, char *res)
{
for (int i = 0; i < strlen(s1); i++) {
res[i] = s1[i] ^ s2[i];
}
res[strlen(s1)] = '\0';
}