在SQL Server中转换为二进制后如何在c#中恢复字符串

在SQL Server中转换为二进制后如何在c#中恢复字符串,c#,sql-server,encoding,binary,ascii,C#,Sql Server,Encoding,Binary,Ascii,我有字符串值键: TxtProductKey.Text has value "key" 对该值进行编码 byte[] Key = Encoding.ASCII.GetBytes(TxtProductKey.Text.Trim()); 将其保存在数据库表中的datatypebinary(50)null列中 表中的值如下所示: 0x6B00000000000000000000000000000000000000000000000000000000000000000000000000000000

我有字符串值键:

TxtProductKey.Text has value "key"
对该值进行编码

 byte[] Key = Encoding.ASCII.GetBytes(TxtProductKey.Text.Trim());
将其保存在数据库表中的datatype
binary(50)null
列中

表中的值如下所示:

0x6B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
cmd.Parameters.Add("@Key", SqlDbType.Binary, binaryData.Length); //dont pass an array longer than what the table can store, or you'll get a "data would be truncated" error
现在,我正在尝试以字符串的形式将其返回,我输入的值是
Key

byte [] TempKey = (byte[])LicenseInfo.Tables[0].Rows[0]["ProductKey"];
var newText = Encoding.ASCII.GetString(TempKey);
但是我在新文本中得到的结果是:

k\0\0\0\0\0\00\
我哪里做错了什么?我希望得到你的建议

在数据库中保存值的C#代码:

Sqlconnection.Open();

SqlCommand Cmd = new SqlCommand("SpAddAttempts", Sqlconnection);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@Attempts", SqlDbType.Int).Value = Attempt;
Cmd.Parameters.Add("@Activate", SqlDbType.Bit).Value = Activate;
Cmd.Parameters.Add("@Key", SqlDbType.Binary).Value = Key;

Cmd.ExecuteNonQuery();
CloseConnection();
存储过程是:

ALTER PROCEDURE [dbo].[SpAddAttempts]
    @Attempts INT,
    @Activate BIT,
    @Key BINARY
AS
BEGIN
    UPDATE License 
    SET Attempts = @Attempts,
        Activate = @Activate,
        ProductKey = @Key 
    WHERE LicenseId = '1'
END

我认为您不能:您在db表中只存储了一个字节(相当于char
k
)。。0x68是
k
,下一个字节是0x00-ascii null-string terminator-无论您选择何种语言,它肯定不是
e

因此,因为只有第一个字节被保留,其余的是ascii NUL 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。。故障发生在表中存储值的过程中(您没有显示该部分的代码)-它只存储了第一个字节

我建议您将此文本存储为文本,而不是二进制;当它以文本的形式开始生命,而您显然希望它以文本的形式返回时,将其存储为二进制似乎是一个不必要的痛苦世界

编辑:现在您已经发布了执行保存的代码,我可以看到您已将参数声明为类型二进制,但您尚未指定长度,因此长度默认为1字节。这就是为什么只保存一个字节的原因。您需要更像这样声明参数:

0x6B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
cmd.Parameters.Add("@Key", SqlDbType.Binary, binaryData.Length); //dont pass an array longer than what the table can store, or you'll get a "data would be truncated" error

你保存得不对。数据只有一个非零字节,它应该有三个字节(即
0x6B657900…
)您可以这样做,您能在调试中看到密钥字节数组的值吗?在它进入数据库之前。该示例仅显示db二进制文件中的一个字符data@dasblinkenlight你能告诉我错误吗?我的保存代码在我的帖子中。@john对Caius Jard(传递长度)答案的编辑应该可以解决这个问题。我输入“key”进行保存,编码的原因是为了保护它,否则直接保存文本很容易。可能是我犯了什么错误,所以它只保存了“key”中的“k”值。哦,是的,将其转换为二进制使其真正安全,只需几个额外的键击即可将其粘贴到其中并恢复原始ascii。ROT13的文本将更难破解(阅读:花几秒钟的时间才意识到这是安全机制)。要么实施适当的安全解决方案,要么将其存储为文本并查看您的“谁拥有sql server密码”策略:)兄弟您似乎更专业,我刚辞职,所以没有太多信息,但感谢您提供更多信息:)我现在编辑了帖子,您可以找到存储数据的代码。如果您希望安全地存储此数据,您需要考虑使其更难随意观察-使用适当的算法对其进行加密。请在存储过程help me中提及二进制列@Key binary(50)的长度。