Base64字符串编码C#vs TSQL

Base64字符串编码C#vs TSQL,c#,tsql,base64,C#,Tsql,Base64,我在C#和TSQL中有base64字符串编码/解码函数,我的问题是C#的编码结果不同于TSQL中的编码结果 我的目标是: C#编码字符串应在TSQL中解码,反之亦然 这两个函数都应该能够对unicode字符进行编码/解码 C# TSQL SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'NVARCHAR(MAX)') Base64Encoding FROM ( SEL

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

我的目标是:

  • C#编码字符串应在TSQL中解码,反之亦然
  • 这两个函数都应该能够对unicode字符进行编码/解码
  • C#

    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=
    

    知道如何匹配结果吗?

    SQL Server正在使用UTF-16。您的C#代码使用UTF-8,因此存在差异

    要使C代码使用UTF-16,可以执行以下操作:

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

    SQL Server正在使用UTF-16。您的C#代码使用UTF-8,因此存在差异

    要使C代码使用UTF-16,可以执行以下操作:

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

    要获得您想要的结果,请使用下面的TSQL

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

    要获得您想要的结果,请使用下面的TSQL

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

    除非“test”不是unicode。如果您将其更改为N'test',您将再次得到与所讨论的相同的结果。@ChiragMM从问题中得出:“我的目标是:[…]两个函数都应该具有编码/解码unicode字符的能力”,因此看起来它必须是unicode。除了“test”不是unicode之外。如果您将其更改为N'test'-您将再次得到与所讨论的相同的结果。@ChiragMM从问题中得到:“我的目标是:[…]两个函数都应该具有编码/解码unicode字符的能力”,因此看起来它必须是unicode。感谢您的解释,您的解决方案按预期运行,现在我清楚地了解了为什么它运行良好。感谢您的解释,您的解决方案按预期运行,现在我清楚地了解了为什么它运行良好。