QString转unsigned char末尾出现随机字符的原因及解决方法
问题原因
unsigned char key[]是二进制字节数组,并非以'\0'结尾的C风格字符串。当你直接将其强制转换为char*构造QString时,QString会从起始地址持续读取字节,直到遇到内存中的第一个'\0'为止——而你的key数组末尾没有这个终止符,因此会额外读取数组后方的随机内存数据,表现为末尾出现随机字符。- 补充:SHA256原始哈希值为32字节二进制数据,对应64字符的十六进制字符串;
crypto_secretbox_KEYBYTES值恰好为32,因此memcpy的长度是正确的,key数组前32字节是有效的原始哈希值,但数组本身没有自动添加终止符。
解决方法
方法1:正确将二进制密钥转回十六进制字符串(用于验证)
如果要验证key内容与原hashedPass一致,不要直接将二进制数组转QString,而是把二进制数组转回十六进制字符串:
// 将key数组转为QByteArray,再生成十六进制字符串 QByteArray keyBa(reinterpret_cast<const char*>(key), crypto_secretbox_KEYBYTES); QString restoredHashedPass = keyBa.toHex(); // 此时restoredHashedPass与hashedPass完全一致,无随机字符
方法2:指定长度构造QString(仅特殊场景使用)
如果必须直接从key数组构造QString,需明确指定读取长度,避免越界:
// 仅读取crypto_secretbox_KEYBYTES个字节,忽略后续内存 QString restoredStr(reinterpret_cast<const char*>(key), crypto_secretbox_KEYBYTES); // 注意:此字符串是二进制数据的字符形式,并非十六进制,与hashedPass格式不同
额外注意事项
- 密钥本身是二进制数据,无需转成QString存储或使用,直接用
QByteArray或unsigned char数组即可;直接转QString容易因二进制中的不可见字符或'\0'引发问题。 - 确认
crypto_secretbox_KEYBYTES值为32(与SHA256长度匹配),若该值大于32,memcpy会从ba1(仅32字节)后方读取随机数据,导致key数组后续字节异常。
内容的提问来源于stack exchange,提问作者Quintus
相关产品推荐
相关产品推荐

