【问题标题】:How to get the original binary value back to string如何将原始二进制值恢复为字符串
【发布时间】:2018-05-30 07:53:29
【问题描述】:

我的 SQL 查询返回值如下

Declare @ID varbinary(18)
Declare @newReturnID NvarCHAR(100) 
set @ID =  CONVERT(VARBINARY(18), CONVERT(VARCHAR(2), CONVERT(VARBINARY(2), 41)) +  CONVERT(VARCHAR(64), NEWID())) 
select  @ID ID

ID(列名)

0x002936354446393642302D333936312D3436

我需要分配一个变量作为我试图转换成的上述值 字符串,但我得到不同的值?

foreach (DataRow dr in dt.Rows)
{
    byte[] bytes = (byte[])dr["ID"];
    string strID = Convert.ToBase64String(bytes, 0, bytes.Length);
}

我的字符串 strID 持有不同的值,而不是上面那个?

让我知道我哪里出错了?

【问题讨论】:

  • "strID 持有不同的值" - 也发布该字符串。
  • 你的 dr["ID"] 和 strID 的值是多少?
  • 我的 StrID 值为:"ACk1MzE4QzFCNC1GOUNCLTQ0"
  • 在 sql 中您会看到 base-16 字符串,但在 c# 中您正在从 db 读取字节数组并转换为 base-64 字符串。为什么你会期望它们是一样的?
  • 首先,您在 SQL 语句中使用了NEWID(),因此您总是会创建不同的值。其次,在您的 C# 中,您将转换为 base64 编码的字符串。因此,对于源字符串和 base64 编码字符串,您永远不会得到相同的结果。第三,当您提供strID 时,您似乎转换了不同的结果。 0x002936354446393642302D333936312D3436 的实际 base64 值为 ACk2NURGOTZCMC0zOTYxLTQ2。第四,您的 varbinary 以 0x00 开头,因此将其转换为字符串将导致字符串以 \0 终止符字符开头。

标签: c# sql sql-server sql-server-2012


【解决方案1】:

您正在将字节转换为 Base64 字符串,而 0x002.. 是字节的十六进制表示。

如果c#代码中非强制转换字符串,请尝试在SQL select语句中选择转换字符串。

select convert(varchar(max), @ID, 1) as  ID

有关Convert 中第三个参数的详细信息,请参阅此链接 (Binary Style)。

编辑:

此外,在 c# 中,您需要将字节数组转换为十六进制字符串。 here 是已经可用于将字节数组转换为十六进制字符串的答案。 从该链接发布的一项功能。

public static string ByteArrayToString(byte[] ba)
{
  StringBuilder hex = new StringBuilder(ba.Length * 2);
  foreach (byte b in ba)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多