2017-03-15 14 views
0

私は文字列をBase64表現にエンコードし、SQL 2012のdbのVARCHAR(MAX)列に格納しました。なぜBASE64文字列がsql 2012でデコードされないのですか?

Declare @FMoney varchar(max) 

Set @FMoney= (Select FinancialMoney from AppliedWorks aw 
where AppliedWorkID= 20082) 

SELECT CAST(CAST(@FMoney as XML).value('.','varbinary(max)') AS varchar(max)) 

をしかし、それは私の元の値を与え、長い別のbase64文字列を与えていない:

今、私はこれを使用して値をデコードしようとしています。

注:DBに格納された値をC#.NETを介して符号化してDBに送信(anhhZWRzaGFzYjJuenVka2J1aWRqcjM1fDE1LjAw)が、復号化は、SQLで行われるべきであるれます。

C#エンコーディングコード:

public static String Encrypt(string strData) 
    { 
     if (strData != "") 
     { 
      strData = string.Format("{0}|{1}", HttpContext.Current.Session.SessionID, strData); 
      SHA1Managed shaM = new SHA1Managed(); 
      Convert.ToBase64String(shaM.ComputeHash(Encoding.ASCII.GetBytes(strData))); 
      Byte[] encByteData; 
      encByteData = ASCIIEncoding.ASCII.GetBytes(strData); 
      String encStrData = Convert.ToBase64String(encByteData); 
      return encStrData; 
     } 
     else 
     { 
      return ""; 
     } 

    } 

アップデート:私はまた、C#の.NETの復号手順を追加しました。

public static String Decrypt(string strData) 
    { 
     if (string.IsNullOrEmpty(strData) == false) 
     { 
      Byte[] decByteData; 
      decByteData = Convert.FromBase64String(strData); 
      String decStrData = ASCIIEncoding.ASCII.GetString(decByteData); 

      String[] SplitValue = decStrData.Split('|'); 

      String ReturnValue = SplitValue[1]; 
      return ReturnValue; 
     } 
     else 
     { 
      return ""; 
     } 

    } 

C#の側には、エンコードとデコードが、私はC#でSOTエンコードを行うと、SQLで解読しようとしているため正常に動作します。

+2

SELECTの文からxs:base64Binary機能が欠落しています(strData))); '何かに? UTF8はエンコーダとしてASCIIよりも賢明かもしれません。 –

+0

いいえ、うまくいきますが、問題はSQL側でエンコードされた値をデコードしないためです – Covert

+0

UTF8.GetBytes/Stringを使用するように変更してください。すべての段階でサンプルの入出力を共有できます。 –

答えて

1

あなたは `Convert.ToBase64String(shaM.ComputeHash(Encoding.ASCII.GetBytesの結果を割り当てない

SELECT CAST(CAST(@FMoney as XML).value('xs:base64Binary(.)','varbinary(max)') AS varchar(max)) 

戻り

jxaedshasb2nzudkbuidjr35|15.00 
関連する問題