LINQ -- -Объекты с 8 -битными данными ASCII

У меня есть интересная проблема с обработкой 8 -битных символов «ASCII» в LINQ -to -Entities, и я надеюсь, что кто-нибудь может дать мне совет.

Я унаследовал базу данных SQL Server 2000, в которой есть несколько зашифрованных псевдо -столбцов, где они просто XOR использовали строку с 0xFF. Не знаю почему, и я знаю, что это отстой, но вот где мы сейчас.

Эти столбцы имеют тип данных SQL char(7)и char(14). Когда вы используете XOR с использованием 0xFF, вы получаете 8-й бит, установленный в каждом случае, поэтому вы в конечном итоге получаете символы, отличные от -ASCII (по определению Microsoft ). Здесь вроде бы указано UTF -8, но декодирование сбивается.

Я могу читать и декодировать эти строки следующим образом:

  1. Получите поле с помощью LINQ как String.
  2. Получите byte[], используяSystem.Text.Encoding.GetEncoding(1252).GetBytes()
  3. Декодируйте с помощью XOR каждого байта с помощью0xFF
  4. Верните декодированную строку с помощьюSystem.Text.Encoding.GetEncoding(1252).GetString()

Это работает отлично.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу вернуть строку ENCODED обратно в SQL Server с помощью LINQ.

Я в основном следую обратному процессу и делаю:

  1. Получите байты, используя ASCIIEncoding.GetBytes(). (Кодовая страница 1252 здесь не нужна, так как это прямая строка.)
  2. Закодируйте байты с помощью 0xFF.
  3. Верните закодированную строку с помощью GetEncoding(1252).GetString().

Если я посмотрю на свою строку, это именно то, что я ожидал. Но если я вставлю это в свою сущность и сделаю SaveChanges(), результирующее значение в SQL Server всегда будет "?????"некоторой длины.

Я уверен, что мне что-то здесь не хватает, но я перепробовал все, что мог придумать, и не могу получить это. На данный момент я просто вернулся к старому -способу использования SqlCommandи выполнения ОБНОВЛЕНИЯ с закодированными строками как SqlParameters.Никаких проблем, работает каждый раз.

Спасибо заранее за любую помощь.


Обновление:

Я попробовал предложение от JamieSee, и я даже не получаю хорошего декодирования с помощью его метода. у меня:

    static void Main(string[] args)
    {
        Encoding characterEncoding = Encoding.GetEncoding(28591);

        HCBPWEBEntities ent = new HCBPWEBEntities();

        var encUser =
            (from users in ent.tblEmployer
            where users.ipkEmpId == 357
            select users.sKey).First();

        Console.Out.WriteLine("Original XOR Encoded PW: {0}", encUser.ToString().Trim());

        byte[] originalBytes = (from character in characterEncoding.GetBytes(encUser.ToString().Trim())
                               select (byte)(character)).ToArray();

        Console.Write("Original Bytes:\t");
        foreach (byte b in originalBytes)
        {
            Console.Write("{0:x} ", b);
        }
        Console.WriteLine(String.Empty);

        byte[] decodedBytes = (from character in characterEncoding.GetBytes(encUser.ToString().Trim())
                               select (byte)(character ^ 0xFF)).ToArray();

        Console.Write("Decoded Bytes:\t");
        foreach (byte b in decodedBytes)
        {
            Console.Write("{0:x} ", b);
        }
        Console.WriteLine(String.Empty);

        string decoded = characterEncoding.GetString(decodedBytes);
        Console.WriteLine("Decoded PW: {0}", decoded);

        ent.Dispose();
    }

Но результатом этого являются:

Исходный кодированный XOR PW :z?o> Исходные байты :7a 9d 6f 3e Декодированные байты :85 62 90 c1 Декодированный PW :?b?A

Пароль на самом деле "abcd"

7
задан jwh20 19 July 2012 в 12:57
поделиться