You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QString转unsigned char末尾出现随机字符的原因及解决方法

问题原因
  1. unsigned char key[]是二进制字节数组,并非以'\0'结尾的C风格字符串。当你直接将其强制转换为char*构造QString时,QString会从起始地址持续读取字节,直到遇到内存中的第一个'\0'为止——而你的key数组末尾没有这个终止符,因此会额外读取数组后方的随机内存数据,表现为末尾出现随机字符。
  2. 补充: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:12:36