У меня есть интересная проблема с обработкой 8 -битных символов «ASCII» в LINQ -to -Entities, и я надеюсь, что кто-нибудь может дать мне совет.
Я унаследовал базу данных SQL Server 2000, в которой есть несколько зашифрованных псевдо -столбцов, где они просто XOR использовали строку с 0xFF
. Не знаю почему, и я знаю, что это отстой, но вот где мы сейчас.
Эти столбцы имеют тип данных SQL char(7)
и char(14)
. Когда вы используете XOR с использованием 0xFF
, вы получаете 8-й бит, установленный в каждом случае, поэтому вы в конечном итоге получаете символы, отличные от -ASCII (по определению Microsoft ). Здесь вроде бы указано UTF -8, но декодирование сбивается.
Я могу читать и декодировать эти строки следующим образом:
String
.byte[]
, используяSystem.Text.Encoding.GetEncoding(1252).GetBytes()
0xFF
System.Text.Encoding.GetEncoding(1252).GetString()
Это работает отлично.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу вернуть строку ENCODED обратно в SQL Server с помощью LINQ.
Я в основном следую обратному процессу и делаю:
ASCIIEncoding.GetBytes()
. (Кодовая страница 1252 здесь не нужна, так как это прямая строка.)0xFF
.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"