【问题标题】:Base64 String Encoding C# vs TSQLBase64 字符串编码 C# 与 TSQL
【发布时间】:2017-11-02 09:34:18
【问题描述】:

我在 C# 和 TSQL 中有 base64 字符串编码/解码函数,我的问题是 C# 的编码结果与 TSQL 中的编码结果不同。

我的目标是:

  1. C# 编码的字符串应该在 TSQL 中解码,反之亦然
  2. 这两个函数都应该能够编码/解码 unicode 字符

C#

Convert.ToBase64String(Encoding.UTF8.GetBytes("test"));

Result: dGVzdA==

TSQL

SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'NVARCHAR(MAX)')   Base64Encoding
FROM 
(
    SELECT CAST(N'test' AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp

Result: dABlAHMAdAA=

知道如何匹配结果吗?

【问题讨论】:

    标签: c# tsql base64


    【解决方案1】:

    SQL Server 使用 UTF-16。您的 C# 代码使用 UTF-8,因此有所不同。

    要让 C# 代码使用 UTF-16,您可以这样做:

    Convert.ToBase64String(Encoding.Unicode.GetBytes("test"))
    
    Result: dABlAHMAdAA=
    

    【讨论】:

    • 感谢您的解释,您的解决方案按预期工作,现在我清楚地了解为什么它运作良好。
    【解决方案2】:

    为了得到你想要的结果使用下面的 TSQL

    SELECT CAST('test' as varbinary(max)) FOR XML PATH(''), BINARY BASE64
    

    【讨论】:

    • 除了 'test' 不是 unicode。如果您将其更改为 N'test' - 您将再次获得与问题相同的结果。
    • @ChiragMM 来自问题:“我的目标是:[...] 这两个函数都应该能够编码/解码 unicode 字符,”所以看起来它必须 是 Unicode。
    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2011-04-22
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多