2

私には2つの機能があります。暗号化機能と復号化機能(下記参照)。復号化機能は特定の単語では100%機能しないため、その理由がわかりません。誰かが私がこれを理解するのを手伝ってもらえますか?関数が配置された後、次のselectステートメントを使用してこの2つの関数をテストしています。

select [dbo].[ufn_EncryptString]('Test1') --This string works
select [dbo].[ufn_DecryptString]('Ôæõ÷µ') 

select [dbo].[ufn_EncryptString]('diaz-mayo') --This string doesn't work 
select [dbo].[ufn_DecryptString]('äêãý±òçĀ÷')

「-」と関係があると思われるかもしれませんが、スペースや特殊文字を含まない単なる名前であり、文字列を復号化できない場合があります。

以下の関数を参照してください。

 CREATE FUNCTION [dbo].[ufn_EncryptString] ( @pClearString VARCHAR(100) )
    RETURNS NVARCHAR(100) AS
    BEGIN

    DECLARE @vEncryptedString NVARCHAR(100)
    DECLARE @vIdx INT
    DECLARE
 @vBaseIncrement INT

    SET @vIdx = 1
    SET @vBaseIncrement = 128
    SET @vEncryptedString = ''

    WHILE @vIdx <= LEN(@pClearString)
    BEGIN
        SET @vEncryptedString = @vEncryptedString + 
                                NCHAR(ASCII(SUBSTRING(@pClearString, @vIdx, 1)) +

      @vBaseIncrement + @vIdx - 1)
        SET @vIdx = @vIdx + 1
    END

    RETURN @vEncryptedString

END
GO


CREATE FUNCTION [dbo].[ufn_DecryptString] ( @pEncryptedString NVARCHAR(100) )
RETURNS VARCHAR(100) AS
BEGIN

DECLARE @vClearString VARCHAR(100)
DECLARE @vIdx INT
DECLARE @vBaseIncrement INT

SET @vIdx = 1
SET @vBaseIncrement = 128
SET @vClearString = ''

WHILE @vIdx <= LEN(@pEncryptedString)
BEGIN
    SET @vClearString = @vClearString + 

            CHAR(UNICODE(SUBSTRING(@pEncryptedString, @vIdx, 1)) - 

        @vBaseIncrement - @vIdx + 1)
    SET @vIdx = @vIdx + 1
END

RETURN @vClearString

END
GO
4

1 に答える 1

4

あなたの機能はうまくいくと思います。あなたの例が問題です。

select [dbo].[ufn_DecryptString]('äêãý±òçĀ÷')

動作しません...しかし、以下はうまく動作します:

select [dbo].[ufn_DecryptString](N'äêãý±òçĀ÷')

N文字列リテラルの先頭に注目してください。N入力パラメーターは実際には UNICODE 文字列であるため、ASCII 文字列にキャストされないようにするために、リテラルの前に を付ける必要があります...

MSDNから:

Unicode 定数は、先頭に N: N'A Unicode string' を付けて指定します。

それ以外の場合、ASCIIに変換すると、実際に渡されäêãý±òçA÷ます...Ā文字だけがリテラルで表されないCHARため、問題が断続的でした.

于 2012-12-11T22:15:50.823 に答える