2

我有两个功能。一个加密函数和一个解密函数(见下文)。解密功能不能 100% 使用特定的单词,我无法弄清楚原因。有人可以帮我解决这个问题吗?在函数到位后,我正在使用以下 select 语句测试这两个函数。

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注意字符串文字的前导?由于您的输入参数实际上是一个 UNICODE 字符串,因此您需要在文字前面加上前缀,N以防止它被转换为 ASCII 字符串......

来自MSDN

Unicode 常量用前导 N 指定:N'A Unicode string'。

否则,当它转换为 ASCII 时,您实际上是在传递äêãý±òçA÷......只有Ā字符没有在CHAR文字中表示,这就是您的问题断断续续的原因。

于 2012-12-11T22:15:50.823 回答