SQL Server varbinary转JSON:byte[]与string编解码不一致问题
问题根源分析
你的代码里用System.Text.Encoding.Unicode(即UTF-16编码)做byte[]和string的互转,但不是所有字节序列都能被UTF-16合法解析为Unicode字符:
- 调用
GetString时,如果原byte数组包含UTF-16无法识别的无效字节组合(比如不完整的代理对、无对应字符的编码值),.NET会自动把这些无效部分替换成替换字符U+FFFD(对应UTF-16字节为0xFD 0xFF)。 - 后续调用
GetBytes时,替换字符会被转成它对应的字节序列,最终导致新生成的byte数组和原数组不一致。
正确处理方式
varbinary存储的是任意二进制数据,不能用字符编码来转string(字符编码是处理文本数据的,不适合二进制数据)。如果要把二进制数据转成可安全序列化到JSON的string,应该用Base64编码:
// 二进制转Base64字符串 string base64Str = Convert.ToBase64String((byte[])value); // Base64字符串转回二进制 byte[] newBytes = Convert.FromBase64String(base64Str); bool isEqual = newBytes.SequenceEqual((byte[])value); // 此处会返回true
Base64是专门将二进制数据编码为ASCII字符串的方案,能保证二进制与字符串之间的无损互转,完全适配你把varbinary列数据转成JSON格式存储或传输的场景。
内容的提问来源于stack exchange,提问作者elle0087
相关产品推荐
相关产品推荐

